在常见的钻石场景中:
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
的两个版本直接访问因为它是模棱两可的。您必须显式转换为 D1
或 D2
为了访问MBase
通过Bottom
对象(正是因为有两个 MBase
s)。
不同的是如果你有一个 D1
几乎继承自 MBase
和一个没有。
关于c++ - 多重继承 - virtual 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10156418/