多重继承 - 虚拟修饰符

时间:2012-04-14 18:59:48

标签: c++ inheritance virtual multiple-inheritance

在常见的钻石场景中:

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

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

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

1 个答案:

答案 0 :(得分:3)

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

MBase Bottom并非直接可以从D1的两个版本访问,因为它不明确。您必须明确转换为D2MBase才能访问BottomMBase个对象(正因为有两个D1)。


如果您有一个MBase实际上是从{{1}}继承而另一个不是{{1}},则会有所不同。