多重継承

C++1 つのクラスを複数の基底クラスから派生できます。 複数の直接基底クラスから一つのクラスが派生することを、多重継承 と呼びます。

次の例では、クラス AB、および C は、 派生クラス X の直接の基底クラスです。

class A { /* ... */ };
class B { /* ... */ };
class C { /* ... */ };
class X : public A, private B, public C { /* ... */ };

次の継承グラフ は、上記の例で示した継承の関係を説明しています。 矢印は、矢印の尾部にあるクラスの直接基底クラスを指し示します。


mult1

派生の順序は、コンストラクターによるデフォルト初期化および デストラクターによる終結処理の順序の決定にのみ関係します。

直接の基底クラスは、派生クラスの基底リストに 2 回以上現れることはできません。

class B1 { /* ... */ };                   // direct base class
class D : public B1, private B1 { /* ... */ }; // error

ただし、次の例に示すように、派生クラスは間接の基底クラスを複数回 継承することができます。


mult2

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 を使用しても、 このようなあいまいさを避けることができます。

関連参照

IBM Copyright 2003