仮想基底クラス
クラス:インデックス への移動
virtual クラスは複数の派生クラスが継承する基底クラスであり、多重継承を使用する場合などに利用されます。
派生クラスには同じ基底クラスを何度も指定することはできません。
class B { ... };
class D : B; B { ...}; // 不正
ただし、派生クラスが間接的に同じ基底クラスを継承することはできます。
class X : public B { ... };
class Y : public B { ... };
class Z : public X, public Y { ...}; // 正しい
この場合、クラス Z の各オブジェクトは、クラス B の 2 つのサブオブジェクトを持ちます。
これによって問題が発生する場合は、virtual キーワードを基底クラス指定子に追加します。例:
class X : virtual public B { ... };
class Y : virtual public B { ... };
class Z : public X, public Y { ... };
これで、B は仮想基底クラスになり、クラス Z はクラス B のサブオブジェクトを 1 つだけ持ちます。
仮想基底クラスのコンストラクタ
仮想基底クラスのコンストラクタは、すべての非仮想基底クラスの前に呼び出されます。
階層に複数の仮想基底クラスが含まれる場合は、宣言された順序で仮想基底クラスのコンストラクタが呼び出されます。
次に、派生クラスのコンストラクタが呼び出される前に、すべての非仮想基底クラスが構築されます。
仮想クラスが非仮想基底クラスから派生している場合は、仮想基底クラスが正しく構築されるように、非仮想基底クラスが最初に構築されます。たとえば、次のコードがあるとします。
class X : public Y , virtual public Z
X one;
次の順序になります。
Z(); //仮想基底クラスの初期化
Y(); // 非仮想基底クラス
X(); // 派生クラス