一、重载、覆盖和隐藏的区别

二、适用场景

1、重载:

  适用于不同的数据类型都需要使用到的功能函数。以数据相加的函数为例,可以在同一个文件内提供以下的重载函数以支持同样的功能:

  int add(int, int);/*2个整数相加*/

  int add(int, int, int);/*3个整数相加*/

  double add(double, double);/*2个double型相加*/

  特别的,形参为指针或引用时,指向的对象分别const和非const的情况,可以重载。比如下方的合并2个string的重置函数,根据实参的类型是否是const,编译器可以自动选择调用哪个:

  string &stringCat(string*, string*);/*指向非const的*/

  const string &stringCat(const string*, const string*)/*指向const,编译通过,因为指针或引用指向的对象的类型不同*/

  string &stringCat(string* const, string* const);/*编译报错。因为非const的参数可以转换为const的,在传入非const实参时第1和第3个函数都适用,所以编译器认为1和3重复定义*/

  编译器会根据参数的类型、参数数量,自动选择匹配的函数。注意参数相同、返回值类型不同的同名函数,不是重载的,编译时会报错。

2、覆盖:

  只能在类的继承中使用。适用于父类和子类都要实现的成员函数,且该函数需要在运行中动态绑定的,这个函数就是虚函数,在动态绑定中子类的虚函数把父类的覆盖了。

  class Base{public: virtual func();};/*基类用virtual关键字定义了一个func()虚函数*/

  class Child : public Base{public: func();};/*子类定义了一个同名、同参数、同返回值的函数,即是覆盖*/

  Base  *pB; Bash B; Child C;

  pB = &B; pB->func();/*动态绑定为Base对象,执行Base的func*/

  pB = &C; pB->func();/*动态绑定为Child对象,执行Child的func*/

  程序在运行时动态解析指针或引用指向的对象属于哪个类,从而决定调用哪个类的成员函数。

3、隐藏

  内层作用域的同名函数或同名变量,会影响外层作用域的同名函数和对象。唯一的例外就是虚函数的覆盖。

  一般建议除了通过覆盖方式继续来的虚函数外,派生的子类里不要出现父类中使用的名字,避免隐藏。

三、其他一些技巧

1、虚函数也能重载

  类的成员函数,无论是否是虚函数,都能被重载。但是如果派生类对虚函数进行覆盖,则相应的重载函数会被隐藏。那么问题来了,派生类怎么才能访问到这些隐藏的函数呢?

  方法一:把所有重载函数都覆盖一遍。

  方法二:使用作用域说明符,显式说明调用的对象。

  方法三:使用using声明语句,将外层的名称拉入内层。这时派生类只需要实现部分的虚函数覆盖,其他函数自动变为可见的重载函数。

C++中重载、覆盖和隐藏的区别,以及适用场景的更多相关文章

  1. java的重载、覆盖和隐藏的区别

    重载:方法名相同,但参数不同的多个同名函数 注意:1.参数不同的意思是参数类型.参数个数.参数顺序至少有一个不同 2.返回值和异常以及访问修饰符,不能作为重载的条件(因为对于匿名调用,会出现歧义,eg ...

  2. ZT C++ 重载、覆盖和隐藏的区别

    重载.覆盖和隐藏的区别 分类: C++ 学习笔记 学习心得与方法 2013-09-26 11:21 50人阅读 评论(0) 收藏 举报 概念区分 “overload”翻译过来就是:超载,过载,重载,超 ...

  3. Java_类和对象(完美总结)_转载_覆盖和隐藏的区别,覆盖就不能使用了,而隐藏提供全局方法名或者全局变量名还可以使用

    转载自海子:http://www.cnblogs.com/dolphin0520/p/3803432.html Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封 ...

  4. C++中的覆盖与隐藏(详细讲解)

    C++类中覆盖与隐藏一直是一个容易理解出错的地方,接下来我就详细讲解一下区别在何处 覆盖指的是子类覆盖父类函数(被覆盖),特征是: 1.分别位于子类和父类中 2.函数名字与参数都相同 3.父类的函数是 ...

  5. JAVA中方法和变量在继承中的覆盖和隐藏

    出处:http://renyanwei.iteye.com/blog/258304 我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际 ...

  6. JAVA中方法和变量在继承中的覆盖和隐藏(一)

    我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊 ...

  7. makefile中重载与取消隐藏规则示例

    学习<跟我一起写Makefile-陈皓>后一直不懂,如何重载或取消隐藏规则 为了博客版面整洁,何为隐藏规则,Makefile基本规则编写等基础支持请自行百度. 需要声明的是:这些知识可能在 ...

  8. Java中的覆盖和隐藏以及final关键字

    Java覆盖和隐藏 (1) 变量只能被隐藏(包括静态和非静态),不能被覆盖: (2) 可以用子类的静态变量隐藏父类的静态变量,也可以用子类的非静态变量隐藏父类的静态变量,也可以用非最终变量(final ...

  9. C++中重载、覆盖与隐藏的区别(转)

    本文摘自林锐博士的<高质量C++/C编程指南>. 成员函数的重载.覆盖(override)与隐藏很容易混淆,C++程序员必须要搞清楚概念,否则错误将防不胜防. 1.重载与覆盖 成员函数被重 ...

随机推荐

  1. 1121 - Reverse the lights 思维题

    http://www.ifrog.cc/acm/problem/1121 我看到这些翻转的题就怕,可能要练下这些专题. 我最怕这类题了. 一开始想了下dp, dp[i][0 / 1]表示完成了前i位, ...

  2. GitHub上优秀Android 开源项目

    GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你 ...

  3. IO(转换流、缓冲流)

    第1章 转换流 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者Output ...

  4. Mysql有什么办法批量去掉某个字段字符中的空格

    Mysql有什么办法批量去掉某个字段字符中的空格?不仅是字符串前后的空格,还包含字符串中间的空格,答案是 replace,使用mysql自带的 replace 函数,另外还有个 trim 函数.   ...

  5. Redis数据库1

    一.启动服务 #进入redis安装文件夹 cd /usr/local/redis/ #开启服务端(后端开启) ./bin/redis-server ./redis.conf #开启客户端 ./bin/ ...

  6. log4cpp安装使用

    1. 主页:http://log4cpp.sourceforge.net“Log4cpp is library of C++ classes for flexible logging to files ...

  7. Java中方法的继承以及父类未被子类覆盖的方法调用的问题

    在看java继承这一块的时候发现了一个问题,即父类未被子类覆盖的方法是如何调用的? 是子类拥有了父类的该方法只是没有显示表示,还是子类调用了父类的该方法. 为此做了一下验证 代码如下: public ...

  8. Python+selenium之fixtures

    fixtures即可以表示测试用例的开始和结束,也可以表示测试类和测试模块的开始和结束. import unittest def setUpModule(): print("test mod ...

  9. SqlServer中生成一串连续数字

    在SQLServer中一串连续数字,如1,2,3,4,5,....或者 1 2 3 4 5 没有现成方法,网上都用通用表表达式递归生成.今天想到一个还算简单的方法,记录下来: select row_n ...

  10. 如何将SAP Multi Target应用部署到SAP云平台的Cloud Foundry环境去

    SHINA是SAP HANA Interactive Education的缩写,是一个demo应用,用于演示如何开发SAP HANA原生应用. 这个应用包含了sample数据以及HANA数据库表,vi ...