【问题标题】:c++ virtual inheritance differencec++虚继承区别
【发布时间】:2016-08-24 14:27:41
【问题描述】:

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

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共享。

【问题讨论】:

    标签: c++ inheritance diamond-problem


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这些例子之间没有区别。

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

      【讨论】:

        【解决方案3】:

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

        所以所有不同之处在于您的意图和代码的真正可读性。

        【讨论】:

          猜你喜欢
          • 2013-09-18
          • 2017-03-31
          • 2016-03-26
          • 2011-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多