10

仮想継承の概念は理解していますが、これに対する答えはどこにも見つかりませんでした。クラス B と C を継承するクラス D があるとします。B と C の両方がクラス A を継承します。したがって、A の 2 つのインスタンスを回避するために、B と C を仮想的に A を継承させることができます。しかし、B と C の両方で仮想継承を指定する必要がありますか?または、2 つのうちの 1 つが実質的に A を継承し、もう 1 つが継承しない場合、A のインスタンスを 1 つだけ作成しますか?

ありがとう

4

2 に答える 2

14

それらはすべて である必要がありますvirtual。C++11 10.1 [class.mi]/7 から:

クラスは、特定の型の仮想基本クラスと非仮想基本クラスの両方を持つことができます。

class B { /* ... */ };
class X : virtual public B { /* ... */ };
class Y : virtual public B { /* ... */ };
class Z : public B { /* ... */ };
class AA : public X, public Y, public Z { /* ... */ };

クラス のオブジェクトの場合、のクラス ラティス内AAの基本クラスのすべての仮想オカレンスは、タイプ のオブジェクト内の単一のサブオブジェクトBに対応し、 のクラス ラティス内の(非仮想) 基本クラスの他のすべてのオカレンスは、 1 対 1に対応します。 -typeのオブジェクト内に別個のサブオブジェクトを持つもの。上記で定義されたクラスが与えられると、以下に示すように、 class には class の 2つのサブオブジェクトと、およびによって共有される仮想オブジェクトがあります。AABAABAABAAAAAABZBBXY

仮想継承の例

于 2012-12-06T21:06:12.130 に答える
9

A を 1 つ持つには、B と C の両方に仮想継承を指定する必要があります。そうしないと、仮想継承を使用していないクラスがクラス A を「共有」します。

これにより、次のことが可能になります。

継承

なぜこれをやりたいのかは別の問題です。

于 2012-12-06T21:11:29.603 に答える