我理解虚拟继承的概念,但我无法在任何地方找到答案。假设您有继承B类和C类的D类.B和C都继承A类。所以你可以让B和C虚拟继承A以避免A的两个实例。但是你必须在B和C都指定虚拟继承吗?或者它是否只创建了一个A实例,如果其中一个实际上继承了A而另一个没有?
由于
答案 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
子对象AA
,B
的类网格中的每个其他出现的(非虚拟)基类AA
与一个不同的B
子对象一一对应类型AA
的对象。鉴于上面定义的课程AA
,课程AA
有两个类B
的子对象:Z
的{{1}}和虚拟B
共享B
和X
,如下所示。
答案 1 :(得分:8)
您需要为B和C指定虚拟继承以具有一个A.否则,不使用虚拟继承的类将“共享”A类。
这可以使人们拥有以下内容:
为什么要这样做是另一回事。