在常见的钻石场景中:
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
)。
区别在于,如果您有一个D1
实际上是从MBase
继承的,而另一个则没有。
关于c++ - 多重继承-虚拟修饰符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10156418/