0

在常见的钻石场景中:

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

1 回答 1

3

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

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


不同之处在于,如果您有一个D1实际上继承自MBase而另一个没有继承。

于 2012-04-14T20:14:42.197 回答