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

标签 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;
}

产生以下编译错误:

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/

相关文章:

c++ - 无法使用 `operator+` 和 `enable_if` 将模板函数 `is_base_of` 的重载限制到我的类层次结构

c++ - C++ 中的动态内存分配需要新的运算符吗?

c++ - 在类中抛出异常的最佳方式是什么?

c# - 如何使用多态+重载改进这种方法以减少IS(类型检查)?

java - 接口(interface)如何在其签名或返回类型中包含引用接口(interface)具体实现类型的方法?

c++ - 链接器何时会在多个定义的符号上出错?

c# - C# 4.0 中的方法重载与可选参数

scala - 克服高阶函数函数参数的 Scala 类型删除

java - 即使方法使用更通用的类型,方法调用也不匹配方法签名

c - 在 C 中,当我在函数签名之后、函数体之前声明一个变量时,这意味着什么?