关于重载:C ++:继承具有相同名称的重载非虚方法和虚方法会导致问题

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!埃米


Deriv中,添加以下内容:

1
using Base::f;

除了@哑铃编码器给出的链接之外,您还可以在类似的问题中找到更多的细节:在C++中重写一个基的重载函数


派生类函数隐藏基函数定义。关于原因和方式的详细解释