函数也会被隐藏!?

来源:互联网 发布:网络货币和虚拟货币 编辑:程序博客网 时间:2024/04/27 05:36

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,因此后者隐藏了前者

还有一个例子就是局部函数声明:
int f(int a);
int main()
{
extern int f(char *);
f(3); //error,不会重载
}

原创粉丝点击