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

fro*_*ite 13 c++

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

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

asc*_*ler 12

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

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


dyp*_*dyp 6

正是我在标准中发现的:

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

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