請看下面的代碼。爲什麼static_cast<D2&>(m).f()
和cout << static_cast<B&>(m).f()
的輸出是33
,而不是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