我有关于虚拟基类的查询。为了解决多重继承中“可怕的死亡钻石”/歧义问题,引入了虚拟基类。
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 {};
答案 0 :(得分:3)
如果您的继承不是virtual
,那么A
成员将在D
课程中出现两次。
如果A
有一个名为_a
的字段,那么在D
中,写B::_a
或C::_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