从派生调用时,编译器找不到基类方法,派生用附加参数定义相同的命名方法

hau*_*ron 6 c++ overloading compilation

这是一个带有简单代码粘贴的ideone链接:http://ideone.com/BBcK3B .

基类具有paramtereless函数,而派生类具有参数.一切都是公开的.

为什么编译器在从B实例调用时无法找到A :: foo()?

代码:

#include <iostream>
using namespace std;

class A
{
public:
    virtual void foo()
    {
        cout << "A::foo" << endl;
    }
};

class B : public A
{
public:
    void foo(int param)
    {
        cout << "B::foo " << param << endl;
    }
};

int main()
{
    B b;
    b.foo();
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

prog.cpp: In function ‘int main()’:
prog.cpp:25:11: error: no matching function for call to ‘B::foo()’
     b.foo();
           ^
prog.cpp:25:11: note: candidate is:
prog.cpp:16:10: note: void B::foo(int)
     void foo(int param)
          ^
prog.cpp:16:10: note:   candidate expects 1 argument, 0 provided
Run Code Online (Sandbox Code Playgroud)

Wal*_*ter 9

这是标准的C++行为:无论参数和限定符如何,基类方法都由同名的派生类方法隐藏.如果要避免这种情况,则必须明确地使基类方法可用:

class B : public A
{
  public:
    void foo(int param)  // hides A::foo()
    {
        cout << "B::foo " << param << endl;
    }
    using A::foo;        // makes A::foo() visible again
};
Run Code Online (Sandbox Code Playgroud)