【发布时间】:2012-12-06 21:01:29
【问题描述】:
我了解虚拟继承的概念,但在任何地方都找不到答案。假设你有继承类 B 和 C 的类 D。B 和 C 都继承类 A。所以你可以让 B 和 C 虚拟继承 A 以避免 A 的两个实例。但是你必须在 B 和 C 上都指定虚拟继承或者如果两者中的一个实际上继承了 A 而另一个没有,它是否已经只创建了一个 A 的实例?
谢谢
【问题讨论】:
标签: c++ multiple-inheritance virtual-inheritance
我了解虚拟继承的概念,但在任何地方都找不到答案。假设你有继承类 B 和 C 的类 D。B 和 C 都继承类 A。所以你可以让 B 和 C 虚拟继承 A 以避免 A 的两个实例。但是你必须在 B 和 C 上都指定虚拟继承或者如果两者中的一个实际上继承了 A 而另一个没有,它是否已经只创建了一个 A 的实例?
谢谢
【问题讨论】:
标签: c++ multiple-inheritance virtual-inheritance
他们必须都是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 类的对象,AA 的类格中基类B 的所有虚拟出现对应于AA 类型对象内的单个B 子对象,并且每隔一个出现AA 的类格中的(非虚拟)基类 B 与 AA 类型对象内的不同 B 子对象一一对应。给定上面定义的类AA,类AA有类B的两个子对象:Z的B和X和Y共享的虚拟B,如下图所示。
【讨论】:
10.1 [class.mi]/6;在最新的可用工作文件 N3485 中,它仍然是 10.1 [class.mi]/7。我没有在10.1 [class.mi]/4 中定义的任何标准副本。
Z 可能具有假设它有自己的类B 的副本的不变量。如果一个类是为虚拟继承而设计的,那么它的代码必须反映其他类可能会更改其任何虚拟继承成员的底层副本。
您需要为 B 和 C 指定一个虚拟继承,才能拥有一个 A。否则,未使用虚拟继承的类将“共享”类 A。
这可以使一个人拥有以下:
为什么要这样做是另一回事。
【讨论】: