仅当类要继承自 时,虚拟继承才相关
Foo
。如果我定义以下内容:
class B {};
class L : virtual public B {};
class R : virtual public B {};
class D : public L, public R {};
那么最终对象将只包含 的一个副本,由和B
共享
。如果没有,类型对象将包含 的两个副本,一个在 中,一个在 中。L
R
virtual
D
B
L
R
有一些论点认为所有继承都应该是虚拟的(因为在它产生影响的情况下,这是您大部分时间想要的)。然而,在实践中,虚拟继承是昂贵的,而且在大多数情况下是不必要的:在一个设计良好的系统中,大多数继承只是从一个或多个“接口”继承的具体类;这样的具体类通常不会被设计为从自身派生,所以没有问题。但也有重要的例外:例如,如果您定义了一个接口,然后对该接口进行了扩展,则扩展应该虚拟地从基本接口继承,因为具体实现可能需要实现多个扩展。或者,如果您正在设计 mixins,其中某些类仅实现部分接口,最后一个类继承自其中几个类(接口的每个部分一个)。最后,关于是否虚拟继承的标准并不太难:
有一些例外,但上述规则在安全方面是错误的;即使在不需要虚拟继承的情况下,虚拟继承通常也是“正确的”。
最后一点:虚拟基必须始终由最派生类初始化,而不是直接继承的类(并声明继承是虚拟的)。然而,在实践中,这不是问题。如果您查看虚拟继承有意义的情况,则始终是从接口继承的情况,该接口不包含数据,因此(仅)具有默认构造函数。如果您发现自己实际上继承了带有带参数的构造函数的类,那么是时候就设计提出一些严肃的问题了。