C++: inheriting overloaded non-virtual method and virtual method both with the same name causes problem
我正在尝试将两个同名的方法(具有不同的参数列表)继承到派生类。其中一个是虚拟的,在派生类中被重写,另一个是非虚拟的。这样,当我试图从派生类对象访问基类的非虚拟方法时,会得到一个编译错误。
这是代码段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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(),并且应保持可访问性。我错了吗?
以下是一些有趣的/附加的评论:
- -重写方法derival::f(int arg)也可以是非虚拟的;错误以任何方式发生
-错误消失/可以规避…
- …通过将派生对象强制转换为基类
…不重写派生中的base::f(int arg)时
…通过将命令"base::f;"添加到派生的公共部分
所以,由于我已经知道如何避免这个编译错误,所以我主要关心的是为什么会发生这个错误!请帮我解释一下…
感谢Advanvce!埃米
在
1 | using Base::f; |
除了@哑铃编码器给出的链接之外,您还可以在类似的问题中找到更多的细节:在C++中重写一个基的重载函数
派生类函数隐藏基函数定义。关于原因和方式的详细解释