以下是使用简单代码粘贴的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();
}
编译错误:
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
答案 0 :(得分: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
};