以下のコードを見てください。 static_cast<D2&>(m).f()
とcout << static_cast<B&>(m).f()
の出力がで、21
でないのはなぜですか?仮想継承 - なぜこの出力
struct B {
virtual int f() {return 1;}
};
struct D1 : virtual public B {
virtual int f(){return 2;}
};
struct D2 : virtual public B{};
struct M : public D1, public D2 {
virtual int f() {return 3;}
};
int main(){
M m;
cout << static_cast<D2&>(m).f();
cout << static_cast<B&>(m).f();
return 0;
}
「21」はなぜですか?仮想関数の全体のポイントは、関数呼び出しがその静的型ではなくオブジェクトの動的型にディスパッチされることです。 – Quentin
ここで仮想*継承*、仮想*関数のみ*は必要ないことを理解していますか?この場合の仮想継承は通常の継承と変わらない。 – HolyBlackCat