我正在學習C++繼承,因此我通過動態創建基類來嘗試此代碼,並對其派生類進行了向下轉換(顯然,它對於向下轉換無效)以便使這個動態創建的Base對象由Derived類指針指向。但是當我通過這個Derived指針調用方法who()
時,它會調用Derived類方法而不是Base類方法。C++繼承:派生類指向基類調用Derived類方法
根據我的假設,沒有爲Derived類創建對象,那麼如何調用非創建的Derived類對象的方法而不是實際創建的Base類對象?
我爲這種現象搜索了一下,但是找不到一個清晰脆弱的解釋來調用非創建的Derived類對象的方法。如果它是根據標準,然後解釋我是如何工作的。 我知道,如果我製作方法virtual
,但這裏使用的方法不是virtual
,故事會有所不同。
class parent{
public:
void who(){
cout << "I am parent";
}
};
class child : public parent{
public:
void who(){
cout << "I am child";
}
};
int main(){
child *c = (child *)new parent();
c->who();
return 0;
}
輸出是I am child
但我預計I am parent
編輯:: 我沒有在上面的代碼中解脫出來了內存並提出了無效沮喪的,因爲我只是想看看會發生什麼。所以只解釋調用方法的這種行爲。
行爲未定義。任何事情都可能發生。即使你讓這個函數變成虛擬的,它也是一樣的未定義的故事。 – molbdnilo
@molbdnilo:我不認爲它在這個特殊情況下是未定義的。看到我非常好的答案。 –
@ P45Imminent - 行爲未定義。事實上,你可以對觀察到的行爲進行理性解釋並不會改變這一點。 「未定義的行爲」意味着語言定義不會告訴您發生了什麼;而已。 –