次のシナリオで何が起こるかわかりません。
class MBase {
public:
MBase(int) {}
virtual char* vf() const = 0;
virtual ~MBase() {}
};
class D1 : public MBase { //NOT VIRTUAL!!!
public:
D1() : MBase(1) {}
char* vf() const { return "D1"; }
};
class D2 : virtual public MBase {
public:
D2() : MBase(2) {}
char* vf() const { return "D2"; }
};
class Bottom : public D1, public D2 {
public:
char* vf() const { return "Bottom"; }
}
Base* b = new Bottom();
ダイアモンドの元の定義では、D1 と D2 の両方が MBase から事実上継承していましたが、ここでは 1 つだけです。Bottom オブジェクトに 2 つの別個のサブオブジェクトが残っているので、コンパイラがどのサブオブジェクトを使用するかを認識できないため、最後の行はコンパイルされませんか?