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