我试图将两个具有不同参数列表的同名方法继承到派生类。其中一个是虚拟的并在派生类中被重写,另一个是非虚拟的。这样做,我在尝试从派生类对象访问基类的非虚拟方法时遇到编译错误。
这是代码片段
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;
}
产生以下编译错误:
error: no matching function for call to ‘Deriv::f()’
note: candidates are: virtual void Deriv::f(int)
我不是 C++ 专家,但直到现在我认为成员方法可以通过其签名完全区分的假设是正确的。因此,不应重写非虚拟方法 Base::f() 并且应保持可访问性。我错了吗?
这里有一些有趣的/补充的评论:
- - 覆盖方法 Deriv::f(int arg) 也可以是非虚拟的;
错误以任一方式发生
- 错误消失/可以规避...
- ... 通过将 Deriv 对象转换为基类
...当不覆盖 Deriv 中的 Base::f(int arg)
...通过添加命令“Base::f;”到 Deriv 的公共(public)部分
所以,既然我已经知道如何避免这个编译错误,我主要感兴趣的是为什么会发生这个错误!
最佳答案
在 Deriv
中,添加:
using Base::f;
除了@DumbCoder 给出的链接外,您还可以在我对类似问题的回答中找到更多详细信息:Overriding a Base's Overloaded Function in C++
关于C++:继承同名的重载非虚方法和虚方法会导致问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3406482/