1 つのクラスを複数の基底クラスから派生できます。
複数の直接基底クラスから一つのクラスが派生することを、多重継承 と呼びます。
次の例では、クラス A、B、および C は、 派生クラス X の直接の基底クラスです。
class A { /* ... */ }; class B { /* ... */ }; class C { /* ... */ }; class X : public A, private B, public C { /* ... */ };
次の継承グラフ は、上記の例で示した継承の関係を説明しています。 矢印は、矢印の尾部にあるクラスの直接基底クラスを指し示します。
派生の順序は、コンストラクターによるデフォルト初期化および デストラクターによる終結処理の順序の決定にのみ関係します。
直接の基底クラスは、派生クラスの基底リストに 2 回以上現れることはできません。
class B1 { /* ... */ }; // direct base class class D : public B1, private B1 { /* ... */ }; // error
ただし、次の例に示すように、派生クラスは間接の基底クラスを複数回 継承することができます。
class L { /* ... */ }; // indirect base class class B2 : public L { /* ... */ }; class B3 : public L { /* ... */ }; class D : public B2, public B3 { /* ... */ }; // valid
上記の例では、クラス D が、クラス B2 を介して、 間接基底クラス L を 1 回継承し、クラス B3 を介して 1 回継承します。 ただし、クラス L の 2 つのサブオブジェクトが存在し、 両方ともクラス D を介してアクセスできるので、あいまいになる可能性があります。 これは、修飾されたクラス名を使用して、クラス L を参照することによって避けることができます。 次に例を示します。
B2::L
または、
B3::L.
また基底クラスの宣言に基底指定子 virtual を使用しても、 このようなあいまいさを避けることができます。
関連参照