C ++中的虚拟基类

时间:2013-04-08 06:56:08

标签: 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 B : public virtual A {};
class C : public A {};
class D : public B, public C {};

3 个答案:

答案 0 :(得分:3)

如果您的继承不是virtual,那么A成员将在D课程中出现两次。

如果A有一个名为_a的字段,那么在D中,写B::_aC::_a会引用两个不同的内存区域。如果您的继承是virtual,那么您只有一个内存区域。

答案 1 :(得分:0)

如果您使用虚拟,则使用foo()的实例调用Class D时不会产生歧义。如果你不使用虚拟而不是它将是歧义.. 但要小心虚拟继承的成本更高,所以要小心使用它。

答案 2 :(得分: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