仮想基底クラス

C++共通の基底クラス A を持つ 2 つの派生クラス B および C があり、 さらに B および C から継承した別のクラス D があるとします。 基底クラス A仮想 として宣言することで、B および C が、同じ A のサブオブジェクトを共用していることを保証できます。

次の例では、クラス D のオブジェクトには、クラス L の 2 つの別個のサブオブジェクトがあり、一方はクラス B1 を介し、 もう一方はクラス B2 を介しています。 クラス B1 および B2基底リスト の基底クラス指定子に、 キーワード virtual を使用することで、 クラス B1 およびクラス B2 が共用している、 型 L のただ一つのサブオブジェクトが存在することを指示できます。

次に例を示します。


virt1

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 つだけ継承するようにすることができます。

派生クラスが仮想基底クラスと非仮想基底クラスを両方とも 持つ場合があります。次に例を示します。


virt2

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 を介して共用されます。

関連参照

IBM Copyright 2003