虚拟继承,足够一个类?

时间:2012-12-06 21:01:30

标签: c++ multiple-inheritance virtual-inheritance

我理解虚拟继承的概念,但我无法在任何地方找到答案。假设您有继承B类和C类的D类.B和C都继承A类。所以你可以让B和C虚拟继承A以避免A的两个实例。但是你必须在B和C都指定虚拟继承吗?或者它是否只创建了一个A实例,如果其中一个实际上继承了A而另一个没有?

由于

2 个答案:

答案 0 :(得分:14)

他们必须都是virtual。从C ++ 11 10.1 [class.mi] / 7:

一个类可以同时拥有给定类型的虚拟和非虚拟基类。

class B { /* ... */ };
class X : virtual public B { /* ... */ };
class Y : virtual public B { /* ... */ };
class Z : public B { /* ... */ };
class AA : public X, public Y, public Z { /* ... */ };

对于类AA的对象,B的类点阵中基类AA的所有虚拟出现都对应于类型对象中的单个B子对象AAB的类网格中的每个其他出现的(非虚拟)基类AA与一个不同的B子对象一一对应类型AA的对象。鉴于上面定义的课程AA,课程AA有两个类B的子对象:Z的{​​{1}}和虚拟B共享BX,如下所示。

virtual inheritance example

答案 1 :(得分:8)

您需要为B和C指定虚拟继承以具有一个A.否则,不使用虚拟继承的类将“共享”A类。

这可以使人们拥有以下内容:

inheritance

为什么要这样做是另一回事。