我正在为我们的内部使用开发一个框架,并且认为所有继承虚拟化都可以避免继承我的类的其他开发人员的钻石问题。
我环顾四周,发现很多关于在面对钻石问题时使用虚拟继承的讨论,但没有关于先发制人的事情。
答案 0 :(得分:12)
请记住,对于非虚拟继承,每个构造函数都只调用直接基类的构造函数。但是使用虚拟继承,派生类最多的类需要调用所有虚拟基类的构造函数。
如果您的基类需要初始化,虚拟继承将意味着树下的每个类都需要正确初始化它。并且树中间的任何类都不能指望它自己的基类按照它想要的方式进行初始化。
答案 1 :(得分:6)
正如我在标准中找到的那样:
static_cast
转换为派生类引用/指针。 [expr.static.cast] / 2,11 this
[basic.life] / 5,6上的placement-new重用存储。根据虚拟基类的实现,可能还有其他缺点。