共通の基底クラス A を持つ 2 つの派生クラス B および C があり、
さらに B および C から継承した別のクラス D があるとします。
基底クラス A を仮想 として宣言することで、B
および C が、同じ A のサブオブジェクトを共用していることを保証できます。
次の例では、クラス D のオブジェクトには、クラス L の 2 つの別個のサブオブジェクトがあり、一方はクラス B1 を介し、 もう一方はクラス B2 を介しています。 クラス B1 および B2 の基底リスト の基底クラス指定子に、 キーワード virtual を使用することで、 クラス B1 およびクラス B2 が共用している、 型 L のただ一つのサブオブジェクトが存在することを指示できます。
次に例を示します。
class L { /* ... */ }; // indirect base class class B1 : virtual public L { /* ... */ }; class B2 : virtual public L { /* ... */ }; class D : public B1, public B2 { /* ... */ }; // valid
この例で、キーワード virtual を使用すると、クラス D のオブジェクトが、 クラス L のサブオブジェクトを 1 つだけ継承するようにすることができます。
派生クラスが仮想基底クラスと非仮想基底クラスを両方とも 持つ場合があります。次に例を示します。
class V { /* ... */ }; class B1 : virtual public V { /* ... */ }; class B2 : virtual public V { /* ... */ }; class B3 : public V { /* ... */ }; class X : public B1, public B2, public B3 { /* ... */ };
上記の例では、クラス X にクラス V のサブオブジェクトが 2 個あり、 一つはクラス B1 とクラス B2 で共用され、 もう一方はクラス B3 を介して共用されます。
関連参照