我已經在cpp中編寫代碼來測試我對動態調度的理解。我認爲在我的程序中輸出應該是「我在NT」。我的理由是:動態調度OOP
- tMethod被定義爲虛擬的,所以動態綁定將用於
- 在運行時類類型的
test
是NT,所以打電話test->tMethod(ont)
應該尋找裏面NT 實施
- 實際參數
ont
的類型是NT的,所以找到精確匹配是tMethod 的NT的impementation
不過,這一方案的輸出爲「我T中我」。
我的推理出了什麼問題?
#include <iostream>
using namespace std;
class T {
public:
virtual void tMethod(T){
cout<<"I'm in T"<<endl;
}
};
class NT: public T{
public:
void tMethod(NT){
cout<<"I'm in NT"<<endl;
}
};
int main()
{
NT ont;
T* test=new NT();
test->tMethod(ont);
return 0;
}
'NT :: tMethod()'採用不同的參數類型到'N :: tMethod()',所以它不會覆蓋。使用'override'關鍵字來防止這種情況 – Galik
儘管如此,也許在這個例子中,他不能使用任何多態的能力,並且可能會遇到未定義的行爲,因爲他通過價值傳遞了它。例如,切片。 – Incomputable
@OlzhasZhumabek這不會是未定義的行爲,除非這些類在其實現中存在UB錯誤。 – juanchopanza