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

时间:2010-08-04 14:26:24

标签: c++ overloading method-signature virtual-inheritance

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

以下是代码段

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的公共部分

所以,既然我已经知道如何避免这个编译错误,我主要对为什么这个错误发生感兴趣!请帮我阐明一下......

先谢谢! emme

2 个答案:

答案 0 :(得分:8)

Deriv中,添加以下内容:

using Base::f;

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

答案 1 :(得分:2)

派生类函数隐藏基本函数定义。 Detailed explaination as to whyhow