PFan上面有人提问了一个关于函数是否被重载的问题,程序如下:
#include<iostream>
using namespace std;
class B
{
public:
void m(int x)
{
cout<<x<<endl;
}
};
class D:public B
{
public:
void m()
{
cout<<"D::m()"<<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
D d1;
d1.m();
d1.m(26); //错误 //??
return 0;
}
我并没有想出究竟是什么出了问题,但是知道如果把对象d1转换成基类就ok了,即((B)d1).m(26); 。
后来看了别人的回帖才知道函数也有scope的,也会被隐藏的。哎,笨了吧!!!
当子类的m()函数与基类的m()函数同名时,就会隐藏基类同名函数,所以m函数不能传参数, 所以d1.m(26)编译错误.
重载的条件有两个:一是同名函数参数不同;二是两个函数在同一scope中 该例子的两个函数不在同一scope,因此后者隐藏了前者 还有一个例子就是局部函数声明: |