【问题标题】:multiple inheritance - virtual modifier多重继承 - 虚拟修饰符
【发布时间】:2012-04-26 17:42:20
【问题描述】:

在常见的钻石场景中:

class MBase {
  public:
    MBase(int) {}
    virtual char const* vf() const = 0;
    virtual ~MBase() {}
};

class D1 : public MBase { //NOT VIRTUAL!!!
  public:
    D1() : MBase(1) {}
    char const* vf() const { return "D1"; }
};

class D2 : virtual public MBase {
  public:
    D2() : MBase(2) {}
    char const* vf() const { return "D2"; }
};

class Bottom : public D1, public D2 {
  public:
    char const* vf() const { return "Bottom"; }
}

如果我将 Bottom 的继承修饰符修改为对 D1 和 D2 都是虚拟的,会发生什么变化?我的意思是,这会产生什么影响吗:

class Bottom : public virtual D1, public virtual D2 {
  public:
    char const* vf() const { return "Bottom"; }
}

【问题讨论】:

    标签: c++ inheritance virtual multiple-inheritance


    【解决方案1】:

    不,它没有。每个类选择它的哪些直接基类可以与其他类共享。由于Bottom 是您实现中的一个叶子,并且在这两种情况下都只有一个D1D2 的实例,因此在这两种情况下它都将只有一个这些类型的嵌套对象。由于D1 拒绝共享MBaseBottom 也将嵌套两个MBase 对象。

    但是MBase 不能直接Bottom 的两个版本中访问,因为它是模棱两可的。您必须显式转换为D1D2 才能通过Bottom 对象访问MBase(正是因为有两个MBases)。


    不同之处在于,如果您有一个实际上继承自 MBaseD1 和一个没有继承的 D1

    【讨论】:

    • 好的,所以我想如果我有几个Bottoms,实际上都继承自D1和D2,那么叶子将只有一个D1和D2副本......非常感谢求完美答案!
    猜你喜欢
    • 2017-03-31
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2014-10-12
    • 2011-10-15
    • 2014-11-06
    相关资源
    最近更新 更多