我试图将两个具有不同参数列表的同名方法继承到派生类 . 其中一个是派生类中的虚拟和重写,另一个是非虚拟的 . 这样做,我在尝试从派生类对象访问基类的非虚方法时遇到编译错误 .
这是代码片段
class Base {
public:
void f() {
cout << "[Base::f()]" << endl;
}
virtual void f(int arg) {
cout << "[Base::f(" << arg << ")]" << endl;
}
};
class Deriv : public Base {
public:
virtual void f(int arg) {
cout << "[Deriv::f(" << arg << ")]" << endl;
}
};
int main() {
Deriv d;
d.f(-1);
d.f(); // <<-- compile error
return 0;
}
这会产生以下编译错误:
错误:没有匹配函数来调用'Deriv :: f()'注意:候选者是:virtual void Deriv :: f(int)
我不是C的专家,但是直到现在我才认为成员方法可以通过他们的签名完全区分是正确的 . 因此,不应该重写非虚方法Base :: f()并且应该仍然可以访问它 . 我错了吗?
以下是一些有趣/额外的评论:
- 重写方法Deriv :: f(int arg)也可以是非虚拟的;错误以任何一种方式发生
- 错误消失/可以规避......
...通过将Deriv对象强制转换为Base类
...当没有在Deriv中覆盖Base :: f(int arg)时
...通过将命令"Base::f;"添加到Deriv的公共部分
所以,既然我已经知道如何避免这个编译错误,我主要感兴趣的是 why 这个错误发生了!请帮我阐明一下......
谢谢你的优点! EMME
2 回答
在
Deriv
中,添加以下内容:除了@DumbCoder提供的链接之外,您还可以在我对类似问题的回答中找到更多详细信息:Overriding a Base's Overloaded Function in C++
派生类函数隐藏基本函数定义 . Detailed explaination as to why和how