我已经在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