c++中的虚基类

Virtual Base Class in C++

本文关键字:基类 c++      更新时间:2023-10-16

我有一个关于虚拟基类的查询。为了解决多重继承中"可怕的死亡之钻"/歧义问题,引入了虚拟基类。

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

class C声明中没有使用关键字virtual会发生什么?你能给我详细解释一下吗?

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

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

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

如果您使用的是virtual,那么当您使用Class D的实例调用foo()时就不会有歧义。如果你不使用虚拟,那就会模棱两可。但是要注意,虚拟继承的成本更高,所以要谨慎使用。

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