曖昧さが解決できないためコンパイルエラー。コンパイルエラーにはならない。0;}この例のような状態は特に菱形継承(ダイアモンド継承)と呼ばれる。仮想継承でない場合、DerivedNVのインスタンスにはDerivedNV1の基底のBase::nとDerivedNV2の基底のBase::nという2つのnが別に存在することになる(メンバ関数も同様)。仮想継承した場合、DerivedVのインスタンスにはBaseの部分はただ1つしか存在しない。DerivedV1の基底とDerivedV2の基底が共有されている状態である。C++ではクラスの多重継承(実装の多重継承)・仮想継承が共に使用できる。後発の言語であるJava、C#、D言語ではいずれも使用できない。代わりに単独継承と0個以上のインタフェース実装(型の多重継承)を用意している。実装の多重継承はメリットよりもデメリットのほうが多いとみなされたためである。継承関係が複雑になるため全体の把握が困難になる。同じ名前を複数の基底クラスがそれぞれ別の意味で用いていた場合、その両方を派生クラスでオーバーライドするのが困難。処理系の実装が複雑になってしまう。仮想継承にしていない場合に同一の基底クラスが複数存在してしまう(これが望ましい場面もあるが)。これの何が問題かというと、最初は仮想継承していなかったものを、後から仮想継承にしたくなったときに、変更点を洗い出すのが大変になるからである。仮想継承を使用するには設計をきちんと行う必要があるということである。多重継承を使う方が直感的になる場合もあるとの主張もあり、どちらが正しいとは言えない状況である。完全な実装多重継承が問題を起こしやすいのは、継承という仕組みの関係上複数の親クラスが対等に扱われる事が原因である。そこで完全な継承を行なう代わりに能力を限定した実装の引き継ぎを行なう手法もある。これらはモジュール、トレイトなどと呼ばれ、通常の継承とは区別される。継承との違いは次のようなものである。インスタンス変数を持たない。特定の構造に依存しない純粋なメソッド定義を行なう。メソッドの集合演算が定義できる。必要に応じてクラスに付加される。クラスの通常継承時にそれらを引き継ぐ必要はない。通常の継承とは独立の継承構造を持つため構造の把握が行ないやすい。意味のつながりを持たないクラス間で横断的に定義されるメソッドで特に有効である。これらの特徴から多重継承の問題のうち1,2,4はほぼ解決できる。一般には多重継承を行なう場合も、このような使い方をする事が望ましいと考えられている。同時に、AはBを汎化したクラスであるといえる。したクラスであるともいえる。視覚的な記述方法としては、AとBを線で結び、A側の線の端に白抜きの三角を描くことで表現する。UML(英語版)その他トピック統一モデリング言語用語集(英語版)ラショナル統一プロセス統一モデリング言語ツール一覧(英語版)カラーUML(英語版)この項目は、コンピュータに関連した書きかけの項目です。この項目を加筆・訂正などしてくださる協力者を求めています(PJ:コンピュータ/P:コンピュータ)。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。Cookieに関する声明モバイルビュ。