c ++虚拟继承差异

时间:2016-08-24 14:27:42

标签: c++ inheritance diamond-problem

给定两个具有公共虚拟基类的类:

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 {};
    

第一个也直接来自虚拟基类,但我认为这没有效果,因为它与Derived1Derived2共享。

3 个答案:

答案 0 :(得分:2)

他们说同样的话。唯一的区别是,如果您从public Derived1的两个定义中删除了public Derived2Derived3,则第一个仍将从Base继承而第二个不会继承。

编辑:我还没有仔细考虑是否存在一些奇怪的交叉投射情况,即两者的行为也会有所不同,尽管我认为不存在。

答案 1 :(得分:2)

这些例子之间没有区别。

但是在更复杂的情况下,直接继承其他继承的虚拟基础可能会改变基类子对象的构造/销毁顺序。

答案 2 :(得分:1)

我认为对象布局没有任何区别,因为虚拟继承的目的是避免使用Base的两个副本(或案例1中的三个副本)。

所以区别在于你的意图和代码的可读性。