给定两个具有公共虚拟基类的类:
class Base {};
class Derived1 : public virtual Base {};
class Derived2 : public virtual Base {};
这两个进一步派生的类之间有什么区别吗?:
class Derived3 : public virtual Base, public Derived1, public Derived2 {};
class Derived3 : public Derived1, public Derived2 {};
第一个也直接来自虚拟基类,但我认为这没有效果,因为它与Derived1
和Derived2
共享。
答案 0 :(得分:2)
他们说同样的话。唯一的区别是,如果您从public Derived1
的两个定义中删除了public Derived2
和Derived3
,则第一个仍将从Base
继承而第二个不会继承。
编辑:我还没有仔细考虑是否存在一些奇怪的交叉投射情况,即两者的行为也会有所不同,尽管我认为不存在。
答案 1 :(得分:2)
这些例子之间没有区别。
但是在更复杂的情况下,直接继承其他继承的虚拟基础可能会改变基类子对象的构造/销毁顺序。
答案 2 :(得分:1)
我认为对象布局没有任何区别,因为虚拟继承的目的是避免使用Base
的两个副本(或案例1中的三个副本)。
所以区别在于你的意图和代码的可读性。