在常见的钻石场景中:

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

最佳答案

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

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



区别在于,如果您有一个D1实际上是从MBase继承的,而另一个则没有。

关于c++ - 多重继承-虚拟修饰符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10156418/

10-16 05:32