题目

C++中名字隐藏是什么?

解答

让我们通过一个例子来讲解C++中的名字隐藏。在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法。你必须重写所有的重载方法, 否则未被重写的方法会因为名字相同而被隐藏,从而使它在派生类中不可见。

请看例子:

class FirstClass{
public:
virtual void MethodA(int);
virtual void MethodA(int, int);
};
void FirstClass::MethodA(int i){
cout<<"ONE"<<endl;
}
void FirstClass::MethodA(int i, int j){
cout<<"TWO"<<endl;
}

上面的类中有两个方法(重载的方法),如果你想在派生类中重写一个参数的函数, 你可以这么做:

class SecondClass : public FirstClass{
public:
void MethodA(int);
};
void SecondClass::MethodA(int i){
cout<<"THREE"<<endl;
} int main (){
SecondClass a;
a.MethodA();
a.MethodA(, );
return ;
}

上面的main函数中,第2个MethodA在编译时会报错,提示没有与之匹配的函数。 这是因为两个参数的MethodA在派生类中是不可见的,这就是名字隐藏。

名字隐藏与虚函数无关。所以不管基类中那两个函数是不是虚函数, 在这里都会发生名字隐藏。解决方法有两个。第一个是将2个参数的MethodA换一个名字, 那么它在派生类中就可见了。但我们既然重载了MethodA,说明它们只是参数不同, 而实际上应该是在做相同或是相似的事的。所以换掉名字并不是个好办法。因此, 我们一般采用第二种方法,在派生类中重写所有的重载函数。

最新文章

  1. Java Swing interview
  2. 【原】理解javascript中的this
  3. spark job, stage ,task介绍。
  4. WebKit技术内幕
  5. AngularJS 特性—SinglePage、template、Controller
  6. Container With Most Water
  7. java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
  8. LA 3516 (计数 DP) Exploring Pyramids
  9. JavasScript基数排序
  10. Dubbo扩展点加载机制
  11. Ubuntu初始化MySQL碰到的坑
  12. OpenShift实战(三):OpenShift持久化存储Redis
  13. hiberate 映射关系 详解
  14. RK3288 uboot启动流程
  15. HTML5 &amp; tel &amp; make a phone call
  16. SSH端口转发详解及实例-转载
  17. 互评Final版本
  18. golang中defer的理解
  19. Abp IRepository 方法解释(1)
  20. java 向上转型和向下转型

热门文章

  1. Office启动加载vs。。。项
  2. 使用RMAN迁移文件系统数据库到ASM
  3. 【转】@Override must override a superclass method 问题解决
  4. HDU 5690 All X 暴力循环节
  5. Flume 与Kafka区别
  6. Hdu oj 5522 Numbers 之解题报告
  7. Tomcat问题笔记
  8. 对String的一点了解
  9. 【Spark学习】Apache Spark调优
  10. HDU-4612 Warm up 边双连通分量+缩点+最长链