将所有继承虚拟化是否有缺点?

时间:2013-06-09 17:59:08

标签: c++

我正在为我们的内部使用开发一个框架,并且认为所有继承虚拟化都可以避免继承我的类的其他开发人员的钻石问题。

我环顾四周,发现很多关于在面对钻石问题时使用虚拟继承的讨论,但没有关于先发制人的事情。

2 个答案:

答案 0 :(得分:12)

请记住,对于非虚拟继承,每个构造函数都只调用直接基类的构造函数。但是使用虚拟继承,派生类最多的类需要调用所有虚拟基类的构造函数。

如果您的基类需要初始化,虚拟继承将意味着树下的每个类都需要正确初始化它。并且树中间的任何类都不能指望它自己的基类按照它想要的方式进行初始化。

答案 1 :(得分:6)

正如我在标准中找到的那样:

  • 虚拟基类由最派生类型初始化(请参阅aschepler的答案)。
  • 如果涉及虚拟继承,则不能使用static_cast转换为派生类引用/指针。 [expr.static.cast] / 2,11
  • 你不能使用C风格的强制转换(“显式类型转换(强制转换符号)”)转换为派生类指针/引用([expr.cast]),至少是[expr.dynamic中的示例。施洗] / 9这样说。 (没有C风格的演员;)
  • 如果有虚拟基类,复制/移动分配和ctor不可能是微不足道的。 [class.copy] / 12,25
  • [class.copy] / 28“未指定表示虚拟基类的子对象是否由隐式定义的复制赋值运算符分配多次。”
  • 如果有虚拟基类,你不能拥有constexpr ctors。 [dcl.constexpr / 4
  • 还有其他细微之处,例如指向成员的转化[conv.mem] / 2,以及通过this [basic.life] / 5,6上的placement-new重用存储。

根据虚拟基类的实现,可能还有其他缺点。