虚拟继承,足够一个类?

Inv*_*lid 10 c++ multiple-inheritance virtual-inheritance

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

谢谢

Bil*_*eal 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 { /* ... */ };
Run Code Online (Sandbox Code Playgroud)

对于类的一个对象AA,基类的所有虚拟出现B在的类晶格AA对应于单个B类型的对象中的子对象AA,和一个(非虚拟)基类的每一个其它存在B于的类晶格AA对应一对- B在类型对象中使用不同的子对象AA.鉴于类AA定义如上,类AA具有类的两个子对象B:ZB和虚拟B通过共享XY,如下所示.

虚拟继承示例

  • @enobayram:因为上面例子中的类'Z`可能有不变量,假设它有自己的类'B`的副本.如果某个类是为虚拟继承而设计的,则其代码必须反映其他类可能会更改其任何虚拟继承成员的基础副本. (2认同)

Ed *_*eal 9

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

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

遗产

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

  • 我给手绘和扫描图表+1. (6认同)