0

仮想基底クラスについて質問があります。多重継承における「恐ろしいダイアモンド オブ デス」/あいまいさの問題を解決するために、仮想基底クラスが導入されました。

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

宣言でキーワードvirtualが使用されていない場合はどうなりますか。class C詳しく説明していただけますか?

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};
4

3 に答える 3

3

継承がそうでない場合virtualAメンバーはDクラスに 2 回存在します。

Aという名前のフィールドがあった場合_a、 では、 orをD記述して 2 つの異なるメモリ ゾーンを参照します。継承が の場合、メモリ ゾーンは 1 つしかありません。B::_aC::_avirtual

于 2013-04-08T07:03:07.130 に答える
0
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};

A クラスから B への継承が仮想としてマークされているが、A クラスから C への継承ではない場合、C++ は単一の仮想 A (D は B を継承し、B は A を継承) と非仮想 A (D は C を継承し、C は A を継承) を作成します。したがって、あなたのコードはひし形の問題を解決しません。

D d_object;
A &a_ref = d_object; // error raised -> B::A or C::A
于 2014-11-02T17:16:03.433 に答える