我了解虚拟继承的概念,但我无法在任何地方找到答案。假设您有继承类 B 和 C 的类 D。B 和 C 都继承类 A。因此您可以使 B 和 C 虚拟继承 A 以避免 A 的两个实例。但是您是否必须在 B 和 C 上都指定虚拟继承或者如果两者中的一个实际上继承了 A 而另一个没有,它是否已经只创建了一个 A 实例?
谢谢
我了解虚拟继承的概念,但我无法在任何地方找到答案。假设您有继承类 B 和 C 的类 D。B 和 C 都继承类 A。因此您可以使 B 和 C 虚拟继承 A 以避免 A 的两个实例。但是您是否必须在 B 和 C 上都指定虚拟继承或者如果两者中的一个实际上继承了 A 而另一个没有,它是否已经只创建了一个 A 实例?
谢谢
他们都必须是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共享的虚拟对象,如下所示。B
AA
B
AA
B
AA
B
AA
AA
AA
B
Z
B
B
X
Y
您需要为 B 和 C 指定一个虚拟继承以拥有一个 A。否则,未使用虚拟继承的类将“共享”类 A。
这可以使一个人拥有以下内容:
为什么要这样做是另一回事。