8

我正在尝试将两个具有不同参数列表的同名方法继承到派生类。其中一个是虚拟的并在派生类中被覆盖,另一个是非虚​​拟的。这样做,我在尝试从派生类对象访问基类的非虚拟方法时遇到编译错误。

这是代码片段

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()'<br /> 注意:候选者是:virtual void Deriv::f(int)

我不是 C++ 方面的专家,但直到现在我认为成员方法可以通过它们的签名完全区分的假设是正确的。因此,非虚拟方法 Base::f() 不应被覆盖并应保持可访问性。我错了吗?

以下是一些有趣的/附加的评论:

    - 重写方法 Deriv::f(int arg) 也可以是非虚拟的;错误以任何一种方式发生
    - 错误消失/可以规避......
      ...通过将 Deriv 对象转换为 Base 类
      ...当不覆盖 Deriv 中的 Base::f(int arg) 时
      ...通过添加命令“Base::f;” 到 Deriv 的公共部分

所以,既然我已经知道如何避免这个编译错误,我主要感兴趣的是为什么会发生这个错误!

4

2 回答 2

10

Deriv中,添加:

using Base::f;

除了@DumbCoder 提供的链接之外,您还可以在我对类似问题的回答中找到更多详细信息:Overriding a Base's Overloaded Function in C++

于 2010-08-04T14:31:16.117 回答
2

派生类函数隐藏了基函数定义。详细解释为什么以及如何

于 2010-08-04T14:32:45.137 回答