我在cpp中编写代码来测试我对动态调度的理解.我认为在我的程序中输出应该是" 我在NT ".我的理由是:
test是NT,所以调用test->tMethod(ont)应该在NT内部寻找实现ont是NT类型,因此发现完全匹配是NT对tMethod的强制执行但是,这个程序的输出是" 我在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;
}
Run Code Online (Sandbox Code Playgroud)
这个方法:
void tMethod(NT){
Run Code Online (Sandbox Code Playgroud)
不会覆盖这一个:
virtual void tMethod(T){
Run Code Online (Sandbox Code Playgroud)
您已将参数类型从更改NT为T
您可以添加覆盖以将此错误转换为错误:
void tMethod(NT) override {
Run Code Online (Sandbox Code Playgroud)
将输出:
main.cpp:16:18:错误:'void NT :: tMethod(NT)'标记为'覆盖',但不覆盖void tMethod(NT)覆盖{
[编辑]
您的实际问题是为什么C++不允许跨类继承重载函数,特别是能够使用基类指针访问派生类函数.原因是语言不支持此功能.您可以在Bjarne Stroustrup FAQ中找到类似的问题:为什么不对重载类进行重载?
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |