10

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

谢谢

4

2 回答 2

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 { /* ... */ };

对于 class 的对象,类格中AA基类的所有虚拟出现对应于类型对象中的单个子对象,并且类格中的(非虚拟)基类的每隔一次出现对应于一对-在 type 的对象中具有不同的子对象。给定上面定义的类,类有两个类的子对象:'s和由and共享的虚拟对象,如下所示。BAABAABAABAAAAAABZBBXY

虚拟继承示例

于 2012-12-06T21:06:12.130 回答
9

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

这可以使一个人拥有以下内容:

遗产

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

于 2012-12-06T21:11:29.603 回答