在常见的钻石场景中:
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"; }
}
答案 0 :(得分:3)
不,不。每个类选择哪些直接基类可以与其他类共享。由于Bottom
是您的实现中的一个叶子,并且在两种情况下都只有一个D1
和D2
的实例,因此在两种情况下都只有一个这些类型的嵌套对象。由于D1
拒绝共享MBase
,Bottom
也会嵌入两个MBase
个对象。
但MBase
Bottom
并非直接可以从D1
的两个版本访问,因为它不明确。您必须明确转换为D2
或MBase
才能访问Bottom
到MBase
个对象(正因为有两个D1
)。
如果您有一个MBase
实际上是从{{1}}继承而另一个不是{{1}},则会有所不同。