一、重载、覆盖和隐藏的区别
二、适用场景
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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- [短文速读] 重载有暗坑,重载重写你真的了解么
- C# 空合并操作符(??)不可重载?其实有黑科技可以间接重载!
- SPL 数组重载
- SPL 数组重载
- JavaScript实现函数重载
- Python 函数如何重载?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Build Your Own Web Site the Right Way Using HTML & CSS
Ian Lloyd / SitePoint / 2006-05-02 / USD 29.95
Build Your Own Website The Right Way Using HTML & CSS teaches web development from scratch, without assuming any previous knowledge of HTML, CSS or web development techniques. This book introduces you......一起来看看 《Build Your Own Web Site the Right Way Using HTML & CSS》 这本书的介绍吧!