C++ C+中的虚拟基类+;

C++ C+中的虚拟基类+;,c++,multiple-inheritance,virtual-inheritance,diamond-problem,C++,Multiple Inheritance,Virtual Inheritance,Diamond Problem,我有一个关于虚拟基类的查询。为了解决多重继承中的“可怕的死亡钻石”/歧义问题,引入了虚拟基类 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 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 {};

如果您的继承不是虚拟的,则
A
成员将在
D
类中出现两次


如果
A
有一个名为
\u A
的字段,那么在
D
中,写入
B:\u A
C::\u A
将指向两个不同的内存区域。如果您的继承是虚拟的,那么您只有一个内存区域。

如果您的继承不是虚拟的,那么
A
成员将在
D
类中出现两次


如果
A
有一个名为
\u A
的字段,那么在
D
中,写入
B:\u A
C::\u A
将指向两个不同的内存区域。如果您的继承是
virtual
,那么您只有一个内存区域。

如果您使用virtual,那么当您使用
类D
的实例调用
foo()
时,将不会出现歧义。如果你不使用虚拟机,那么它就会变得模棱两可。。
但是要小心,虚拟继承的成本更高,所以要小心使用它。

如果您使用的是virtual,那么当您使用
类D
的实例调用
foo()
时,就不会出现歧义。如果你不使用虚拟机,那么它就会变得模棱两可。。
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public A {};
class D : public B, public C {};
但是要小心,虚拟继承的成本更高,所以要小心使用

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

如果从A类到B的标记为虚而非类为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

如果从A类到B的标记为虚而非类为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

可能使用的StimoToT复制:使用组合继承(使用基于组件的设计模式)“死亡菱形”是C++多重继承中的问题,而不是多继承性。可能是SeNoToT的复制:使用合成继承(使用基于组件的设计模式)“死亡钻石”是C++多重继承中的问题,而不是多重继承。