c++ - 多重继承 - virtual 修饰符

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

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

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

最佳答案

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

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


不同的是如果你有一个 D1几乎继承自 MBase和一个没有。

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

相关文章:

c++ - Qt 崩溃中工作线程的删除和清理

c++ - 如何缩短命令行命令?

c++ - 如何使用 COMMTIMEOUTS 等待直到字节可用但读取了一个以上的字节?

c++ - 如果不是手动完成,子类是否会继承父类的析构函数?

c++ - 显示列表、OpenGL、C++ 中的 "R6025 - pure virtual call"

c++ - CUDA 在内核中对在主机上创建的对象调用虚拟方法

c++ - "virtual"关键字在 C++ 的基类中是可选的吗?

c++ - 检查并行化 BLAS 例程的结果

c++ - vtable 在虚拟继承的情况下

c++ - 无需重复代码的继承