【问题标题】:C++: inheriting overloaded non-virtual method and virtual method both with the same name causes problemC ++:继承重载的非虚拟方法和同名的虚拟方法会导致问题
【发布时间】:2011-03-25 07:17:46
【问题描述】:

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

这里是代码sn-p

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() 不应被覆盖并应保持可访问性。我错了吗?

这里有一些有趣的/额外的 cmets:

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

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

【问题讨论】:

  • 当您说“...通过将命令“Base::f;”添加到 Deriv 的公共部分”时,您的意思是 using Base::f;?
  • @Tomaka17:不,我的意思是:把行 Base::f;到班级。但显然这与“使用..”命令相同。

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


【解决方案1】:

Deriv 中添加:

using Base::f;

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

【讨论】:

  • 是的,我已经知道这一点(请参阅代码 sn-p 下面的我的 cmets)。但是为什么必须添加这个,它有什么作用?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    相关资源
    最近更新 更多