Iud是什么| 贫血看什么指标| 水怡是什么| 茉莉花是什么颜色| 楚楚欲动是什么意思| 些几 是什么意思| 鑫字代表什么生肖| 日文上下结构念什么| 执拗是什么意思| 胃泌素瘤是什么意思| 肝囊肿饮食要注意什么| 福晋是什么意思| 蕾字五行属什么| pa环是什么| 一劳永逸什么意思| 六月二十三号是什么星座| 睡觉张嘴巴是什么原因| 什么是极光| 断桥铝是什么意思| tga是什么意思| 测测你天生靠什么吃饭| 安抚是什么意思| 香蕉什么时候成熟| 客服是什么意思| 小猫吃什么| 痹是什么意思| 孕妇梦见黑蛇是什么意思| 无赖不还钱最怕什么| 中性粒细胞偏低是什么原因| 为什么会梦遗| 梦见洪水是什么意思| copd是什么意思| 鸡蛋黄发红是什么原因| 互卦是什么意思| 溃疡是什么| 阿普唑仑片是什么药| 生物工程专业学什么| navy什么意思| 虫草是什么| 各奔东西是什么意思| 什么下奶最快最多| 血小板计数偏低是什么意思| 11月7号是什么星座| 梦见缝被子是什么意思| 吃什么药能推迟月经| 用什么洗脸可以美白| 脚后跟骨头疼是什么原因| 女性喝红茶有什么好处| 薄荷叶泡水喝有什么功效和作用| 张郃字什么| 六角恐龙吃什么| 月经不调有什么危害| 3月7号是什么星座| 肺动脉增宽是什么意思| 肝右叶占位是什么意思| 兰花什么时候开| 深耕是什么意思| 什么拉车连蹦带跳歇后语| 舌根发黑是什么原因| 港澳通行证办理需要什么材料| 100聚酯纤维是什么面料| 吃什么美容养颜抗衰老| 缺铁吃什么好| 阴干吃什么补雌激素| 头疼应该挂什么科| 尿酸检查什么项目| led灯是什么| 肾疼是因为什么| 梦见塌方是什么预兆| 献血对身体有什么好处| 日光性皮炎用什么药| 双肾小结石是什么意思| 网球大满贯什么意思| 蒂是什么意思| 胃得宁又叫什么名字| 安保是什么工作| 什么蜘蛛有毒| 叫什么| 孕吐是什么原因造成的| 食道炎吃什么药好| 颈椎反弓有什么症状| adidas是什么牌子| 蛋白质高是什么原因| 路人甲什么意思| 乙肝五项135阳性是什么意思| 血糖高吃什么主食最好| 小孩反复发烧是什么原因| 翡翠是什么| 牛黄是什么| 牛腩炖什么好吃| 吃什么治便秘最有效| 禾花鱼是什么鱼| lsp是什么| hia是什么意思| 二毛二是什么军衔| 鱼胶是鱼的什么部位| 杠杠的是什么意思| cbg是什么意思| 肠胃性感冒吃什么药| 真好是什么意思| 本子是什么意思| 地痞是什么意思| 燕子喜欢吃什么| 狗狗发烧吃什么药| 双字五行属什么| 山狸是什么动物| 为什么睡觉流口水很臭| 心脏供血不足吃什么| 容颜是什么意思| 湘字五行属什么的| 头晕头重昏昏沉沉是什么原因| br是什么元素| 喜欢喝冰水是什么原因| 白细胞高一点点是什么原因| 恬静是什么意思| 乙肝弱阳性是什么意思| 智商高是什么意思| 纵隔是什么意思| 脾虚吃什么好| 狸猫换太子什么意思| 清朝前面是什么朝代| 皮的偏旁是什么| 扁桃体发炎吃什么药好得快| 脚后跟疼痛是什么原因| 梦见小青蛇是什么预兆| 胡言乱语是什么意思| 静脉曲张挂什么科| 拉痢疾是什么症状| 什么人不能吃韭菜| 脑梗适合吃什么水果| 备孕需要吃什么| 早上喝豆浆有什么好处| 月经来了不能吃什么东西| 为什么喝酒后会头疼| 破釜沉舟什么意思| 黄鼠狼最怕什么| 越睡越困是什么原因| 男士感染霉菌用什么药| 大便潜血阳性意味着什么| 心跳过速是什么原因| 君子什么意思| 女人的第二张脸是什么| 梦见白蛇是什么预兆| 吃什么最补钙| 十一月二十四是什么星座| 宝宝手足口病吃什么药| 白玫瑰花语是什么| 看头部挂什么科| 拔完火罐要注意什么| 梦见吐痰是什么意思| 掼蛋是什么意思| 肾上腺增生是什么意思| 圣诞节送孩子什么礼物好| 耳朵背后有痣代表什么| 四叶草代表什么| 舞象之年是什么意思| 黄辣丁吃什么食物| 微不足道的意思是什么| 血虚吃什么中成药最好| 咳嗽不能吃什么水果| 湿气太重吃什么好| 适当是什么意思| 梅花什么时候开| 什么的宇宙| 怀孕初期吃什么水果好| 翠玉是什么玉| 银装素裹是什么意思| 25度天气穿什么衣服| 跌宕起伏什么意思| 梦见别人给我介绍对象是什么意思| 糖化血红蛋白是查什么的| 淋巴结肿大是什么样子的| 淋巴细胞是什么| 萎缩性胃炎不能吃什么食物| 长水泡是什么原因| 营卫不和是什么意思| 上焦湿热吃什么中成药| 开平方是什么意思| 牙齿冷热都疼是什么原因| 减肥喝什么茶最好最快| 嗓子干痒吃什么药| 梦见买苹果是什么征兆| 膝盖咔咔响是什么原因| 谈什么色变| 梦见吃李子是什么意思| 人流前需要检查什么项目| 什么是漂洗| 什么动物有四个胃| 家里有小蜘蛛预示什么| 便秘吃什么药快速排便| 肩宽适合穿什么样的衣服| 邓紫棋和华晨宇什么关系| 观音菩萨保佑什么| 尿酸高的人吃什么食物好| 术后吃什么水果| 脂溢性皮炎有什么症状| 杜甫自号什么| 寅时是什么时间| 梦见很多牛是什么兆头| 坐高铁不能带什么| hpv66阳性是什么意思| 乳腺彩超什么时候做最准确| 你有毒是什么意思| 智齿是什么原因引起的| 林冲到底属什么生肖的| 侬是什么意思| 新奇的什么| 空调滴水什么原因| 芒硝有什么作用| 巡视员是什么级别| 涤纶是什么材料| 抢救失血伤员时要先采取什么措施| 67年的羊是什么命| 五月17号是什么星座| 支那人什么意思| 为什么抽烟会上瘾| 小肚子胀痛什么原因| 算了吧什么意思| 1999年属什么生肖| 经费是什么意思| 吃斋是什么意思| 点痦子去医院挂什么科| 皮肤经常痒是什么原因| kenzo是什么牌子| 月经下不来是什么原因| 老打喷嚏是什么原因| 乳酪和奶酪有什么区别| 打包是什么意思| 46是什么意思| 为什么老是打嗝| 去年属什么生肖| 话赶话是什么意思| jb是什么意思| 急性荨麻疹吃什么药| 楚门的世界是什么意思| 威海有什么特产| 快车和专车有什么区别| 省长是什么级别| 气道高反应是什么意思| 脸上长痘是什么原因| 龟头有点痒擦什么药| 癫狂是什么意思| 子宫内膜薄是什么原因| 大脚趾头麻木是什么原因| 晒伤用什么药膏| 瞩目是什么意思| 红粉是什么意思| 长生殿讲的是什么故事| 子不问卜自惹祸殃什么意思| 艾灸后放屁多是什么原因| 压箱钱是什么意思| 喝酒前吃什么不容易醉| 面色发黄是什么原因| 什么颜色衣服最防晒| 大腿根部痛是什么原因| 林冲属于什么生肖| 卵磷脂是什么| 后背疼痛什么原因| 这是什么虫子| 环球中心有什么好玩的| 左室舒张功能减低吃什么药| 什么是早恋| emg是什么意思| 蜂蜜有什么作用与功效| 百度コンテンツにスキップ

他们敢在将乐龙池社区私自开设课业辅导班……

出典: フリー百科事典『ウィキペディア(Wikipedia)』
百度 具体费用根据车型以到店核算为准。

コンピュータプログラミングにおける継承(けいしょう、: inheritance)とは、任意のオブジェクトの特性を、他のオブジェクトの特性の基礎にするためのメカニズムと定義されている。

基礎にされる継承元は親、その継承先は子と呼ばれて、状態機能定数注釈などが引き継がれるが、コンストラクタデストラクタは対象外になる。その親と子の関係を、クラスベースOOPはスーパークラスサブクラスの関係で、プロトタイプベースOOPはプロトタイプとクローンの関係で導入している[1]

概要

[編集]
継承図

継承は、他のオブジェクトの特性(データ?手続き?関数?定数?アノテーションなど)を引き継ぐという概念であり、引き継いだオブジェクトがどのような性質を持ち、どのように振る舞うのかは全くの任意になる。引き継ぎかたは、リクエストされた特性をそのオブジェクトが持たない場合は、自動的に上位オブジェクトの方でサーチするという方式が一般的であり、これは暗黙の委譲(delegation)ベースとも呼ばれる。他には、インスタンス化時にその型の継承チェーンを走査してその全要素を集めて同名重複要素を解決して1つの実体を生成するという方式もあり、これは連結(concatenation)ベースとも呼ばれる。

他オブジェクトの特性を引き継ぐという概念は、それに新しい特性群を付け足しての手軽なオブジェクトの機能拡張と、引き継がれる共通の特性群を上位ノードにしたオブジェクトの分類体系化をもたらしている。これは差分プログラミングとも呼ばれ、プログラムの再利用性と保守性を高めるとされている。

継承(inheritance)とサブタイピング(subtyping)は混同されやすい。ここでのサブタイピングは、親オブジェクトに対する子オブジェクトの安全な代替/代入(substitute)を保証する継承という意味で使われている。それに対してのただの継承は、親オブジェクトの特性をただ引き継ぐことに専念しており、安全な代替/代入には無関心である。たとえ話としては、親の白黒映画をカラー映画化するのが代替可能なサブタイピングであり、親の白黒映画をメディアミックス的グッズ販売につなげるのが代替不可な継承になる。継承に代入可能性(substitutability)を順守させてサブタイピングにすることを提唱しているのが、リスコフの置換原則である。

継承と対比される概念にコンポジション (合成)英語版がある。継承のサブタイピング用法の上位概念と下位概念Is-a)に対して、合成は(Has-a)であるが、継承の非サブタイピング用法では、スーパークラスとサブクラスの関係が(Is-aでもHas-aでもない)の関係になることがしばしばあるので、それと合成との使い分けが重視されるようになっている。

継承の目的

[編集]

差分プログラミング

[編集]

差分プログラミング(difference coding)とは、クラス間の共通構成を、各クラスの特有構成に引き継がせるようにして、重複構成の削減と、分類体系化をもたらすことを目的にした継承の用法である。これは、クラスに新機能を付け足しての手軽なクラス拡張目的と、クラスの共通部分を括りだして体系化するクラス分類目的の双方に使われた。

差分プログラミングは、継承の元々の用法であり、プログラムの再利用性と保守性を高めると見なされていたが、後年になると階層分散配置されたデータとメソッドの把握のしづらさによる弊害の方が目立つようになって、この用法を否定する傾向が強くなった。同時にその代替としての合成英語版が重視されるようになっている。

サブタイピング

[編集]

サブタイピング(subtyping)とは、スーパークラスのインスタンスを、サブクラスのインスタンスで安全に代替できることを指針にした継承の用法である。基底クラスの変数への、派生クラスのインスタンスの安全な代入可能性(substitutability)を保証している。これはIs-a関係とも言われる。サブタイピングでは、派生側でのフィールドの追加は抑制され、基底側からのメソッド実装の引き継ぎも抑制されており、基底側からのメソッド定義(メソッドシグネチャ)の引き継ぎが重視されている。派生インスタンスが代入された基底変数のメソッド名から派生メソッド内容が呼び出される言語機能は、メソッドオーバーライドと呼ばれ、その機能概念は動的ディスパッチ英語版と呼ばれる。サブタイピングは動的ディスパッチに焦点を当てた継承と解釈できる。

具象メソッド(定義+実装)の引き継ぎは実装継承(implementation inheritance)またはコード継承(code inheritance)と呼ばれており、抽象メソッド(定義だけ)の引き継ぎは界面継承(interface inheritance)と呼ばれている。

Is-a関係サブタイピング主体の継承関係は、UMLクラス図では汎化/特化の関係に投影されている。抽象メソッドだけで構成される純粋抽象クラスは、インターフェースと呼ばれており、それとの継承関係はUMLクラス図では実現/実装の関係に投影されている。

サブタイピングのコーディング例はこうなる。

#include <iostream>
#include <string>
#include <typeinfo>

class Base {
public:
    virtual ~Base() {}
    virtual std::string greet() const = 0;
};

class Derived : public Base {
    virtual ~Derived() { std::cout << "Destructor of Derived is called." << std::endl; }
    virtual std::string greet() const { return "Hello!"; }
};

int main() {
    Base* b = new Derived(); // OK
    std::cout << "Message: " << b->greet() << std::endl;
    std::cout << "Is instance of Derived? " << std::boolalpha << (typeid(*b) == typeid(Derived)) << std::endl;
    delete b;
    return 0;
}

多重継承

[編集]

クラスに複数のスーパークラスを持たせることを多重継承という。単一継承と異なり、多重継承では、スーパークラス上のメンバサーチが複数方向に分かれるので、どのメンバが参照されるのかの把握が困難になるという欠点がある。特にフィールドの多重継承?分散配置は、早期に原則禁止が一般化している。メソッドの方はやむなく許容されたので、メソッド決定順序(MRO)問題が取り沙汰された。MRO問題を解決するために導入されたのが、インターフェースの実装やトレイトのインクルードであり、双方はデータ主体クラスを単一継承にしてメソッド主体クラスを多重継承にするというハイブリッド継承の担い手になった。

また、多重継承上のスーパークラスの重複による菱形継承問題も問題視されるようになっている。菱形継承問題の解決策としては、C++/Eiffel発の仮想継承Eiffel発のリネーミング、Python発のC3線形化などがある。

多重継承と仮想継承のコーディング例を以下に示す。同一のクラスから継承している複数の派生クラスを多重継承して1つのクラスを作る場合に始めの基底クラスの存在をどうするかによって仮想継承と通常の多重継承の2つに分かれる。

class Base {
public:
    int n;
};

// 非仮想継承。
class DerivedNV1 : public Base { /* ... */ };
class DerivedNV2 : public Base { /* ... */ };

// 仮想継承。
class DerivedV1 : public virtual Base { /* ... */ };
class DerivedV2 : public virtual Base { /* ... */ };

class DerivedNV : public DerivedNV1, public DerivedNV2 { /* ... */ };
class DerivedV : public DerivedV1, public DerivedV2 { /* ... */ };

int main() {
    DerivedNV nv;
    //nv.n = 0; // 曖昧さが解決できないためコンパイルエラー。
    nv.DerivedNV1::n = 0;
    nv.DerivedNV2::n = 0;
    DerivedV v;
    v.n = 0; // コンパイルエラーにはならない。
    return 0;
}

この例のような状態は特に菱形継承(ダイアモンド継承)と呼ばれる。

仮想継承でない場合、DerivedNVインスタンスにはDerivedNV1の基底のBase::nDerivedNV2の基底のBase::nという2つのnが別に存在することになる(メンバ関数も同様)。一方、仮想継承した場合、DerivedVのインスタンスにはBaseの部分はただ1つしか存在しない。DerivedV1の基底とDerivedV2の基底が共有されている状態である。

先発OOP言語のC++Eiffelでは実装の多重継承ができたが、後発言語のJavaC#では実装は単一継承限定にされ、代わりにインターフェースの多重継承(界面の多重継承)が導入されている。なぜなら実装の多重継承はメリットよりもデメリットのほうが多いとみなされたためである。

  1. 継承関係が複雑になるため全体の把握が困難になる。
  2. 名前の衝突。同じ名前を複数の基底クラスがそれぞれ別の意味で用いていた場合、その両方を派生クラスでオーバーライドするのが困難。
  3. 処理系の実装が複雑になってしまう。
  4. 仮想継承にしていない場合に同一の基底クラスが複数存在してしまう(これが望ましい場面もあるが)。これの何が問題かというと、最初は仮想継承していなかったものを、後から仮想継承にしたくなったときに、変更点を洗い出すのが大変になるからである。つまり仮想継承を使用するには設計をきちんと行う必要があるということである。

しかしながら多重継承を使う方が直感的になる場合もあるとの主張もあり、どちらが正しいとは言えない状況である。

カプセル化の可視性と継承の可視性

[編集]

カプセル化の可視性(public/protected/package/private)によって、各スーパークラスメンバの受け継ぎが取捨選択されることは、派生型に対する継承の大きな特徴である。privateメンバはサブクラスに受け継がれない。packageメンバは外部パッケージのサブクラスには受け継がれない。

継承の可視性は、スーパークラスメンバ(フィールド/メソッド)の可視性に更に制約をかける機能である。三段階ある。

  1. public継承 - そのままの継承。
  2. protected継承 - スーパークラスのpublicメンバを、protectedメンバに引き下げて継承する。
  3. private継承 - スーパークラスのpublic/protectedメンバを、privateメンバに引き下げて継承する。

これはC++で導入されていたが、後継OOP言語ではほとんど採用されていない。

ミックスイン

[編集]

ミックスイン(Mix-in)は、多重継承問題の解決策を発端にしたもう1つの継承方法論である。メソッドの集合体を継承することで、その機能をクラスに注入することを目的にしており、メソッド集合体とクラスの間には汎化/特化の関係がないままで、多重継承を前提にしている。そのメソッド集合体はトレイトとされることが多く、他にモジュール、プロトコル、ロールといった形態もある。トレイトの継承はインクルードと呼ぶのが好まれ多重継承前提である。ミックスインはそれらをひっくるめた方法論としての用語になっている。

界面継承のインターフェース(抽象メソッドをまとめたクラス)と、Mix-in継承のトレイト(独立メソッドをまとめたモジュール)は双方とも多重継承前提なのでよく対比されて説明される。双方の違いを列挙すると以下のようになる。

  • 界面継承は抽象メソッドをクラスに相続させるのに対して、Mix-in継承は独立メソッドをクラスに贈与する。
  • 界面継承はインターフェースの継承先クラスに実装メソッドを記述するが、Mix-in継承はトレイトに実装メソッドを記述する。
  • 界面継承は同名アルゴリズムを個々のクラスのメソッドに分散記述するが、Mix-in継承は1つのメソッドに個々のクラスのアルゴリズムを一括記述する。
  • インターフェースはデータメンバを持つことを想定されていないが、トレイトはデータメンバを持つ。すなわち界面継承は派生メソッドたち専用の共有データを持てないが、Mix-in継承はそれが可能である。
  • 界面継承はthis参照を暗黙使用できるが、Mix-in継承は不可なのでThis参照の明示的な引数渡しや関連型の機能が必要になる。
  • インターフェースは記名的型付けであるのに対して、トレイトは構造的型付けで識別されることが多い。

UMLにおける継承

[編集]

統一モデリング言語 (UML) のクラス図では、サブクラスから見たスーパークラスは汎化 (generalization) 、スーパークラスから見たサブクラスは特化 (specialization) と呼ばれる。

純粋抽象クラスはインターフェースと定義されており、クラスから見たインターフェースは実現(realization)[要検証]、クラスがインターフェースを継承することは実装(implementation)と呼ばれる。

サブタイピング用法の投影は汎化/特化の関係であり、インターフェース用法の投影は実現/実装の関係である。ミックスイン用法はUMLクラス図で扱われていない関係であり、差分プログラミング用法も同様である。

脚注

[編集]
  1. ^ MDN contributors (2025-08-14). “継承とプロトタイプチェーン - JavaScript”. developer.mozilla.org. 2025-08-14閲覧.{{cite web2}}: CS1メンテナンス: 数字を含む名前/author (カテゴリ)

関連項目

[編集]
四月十一日是什么星座 女生下面是什么样的 18k是什么意思 生气什么什么 阴道排气是什么原因
左卵巢内囊性结构什么意思 喝生鸡蛋有什么好处 为什么说婴儿摔床没事 血沉偏高说明什么 做什么梦暗示你怀孕了
左室舒张功能减退是什么意思 胃窦黄斑瘤是什么病 做梦梦见火是什么征兆 牙疼吃什么药 做梦买房子是什么预兆
今天开什么奖 慢性胃炎吃什么中成药 产酸克雷伯菌属于什么菌 resp是什么意思 央企与国企有什么区别
无事不登三宝殿什么意思hcv9jop0ns5r.cn 斤加一笔是什么字hcv9jop4ns3r.cn 老年人吃什么增强免疫力jasonfriends.com 青瓜是什么hcv7jop6ns2r.cn 狗可以吃什么0735v.com
荔枝有什么营养hcv7jop6ns8r.cn 木加鬼念什么hcv7jop5ns1r.cn 218是什么意思xinjiangjialails.com 缺钙应该吃什么hcv8jop5ns0r.cn 中暑不能吃什么hcv8jop7ns3r.cn
1988年属什么今年多大aiwuzhiyu.com 孩子晚上睡觉磨牙是什么原因hlguo.com 为什么家里不能放假花hcv8jop8ns6r.cn model什么意思hcv9jop5ns8r.cn 什么中药化结石最厉害xianpinbao.com
私处长痘痘是什么原因hcv9jop2ns8r.cn 为什么老是打喷嚏hcv8jop2ns1r.cn 放屁很臭是什么原因mmeoe.com 113是什么意思hcv8jop4ns3r.cn 新是什么意思hcv8jop4ns4r.cn
百度