C++中重载、覆盖和隐藏的区别以及适用场景

栏目: C++ · 发布时间: 6年前

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

C++中重载、覆盖和隐藏的区别以及适用场景

二、适用场景

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声明语句,将外层的名称拉入内层。这时派生类只需要实现部分的虚函数覆盖,其他函数自动变为可见的重载函数。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址: https://www.linuxidc.com/Linux/2018-10/155049.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Redis实战

Redis实战

Josiah L. Carlson / 黄健宏 / 人民邮电出版社 / 2015-10

【内容简介】 本书深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法。除此之外,书中还讲述了Redis的优化方法以及扩展方法,是一本对于学习和使用 Redis 来说不可多得的参考书籍。 本书一共由三个部分组成。第一部分对Redis进行了介 绍,说明了Redis的基本使用方法、它拥有的5种数据结构以及操作这5种数据结构的命令,并讲解了如何使用Redis去构......一起来看看 《Redis实战》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器