注1:overload——重载,override——覆盖(有一些人翻译成重写或覆写)。
学习C++这么久了,才发现自己一直只知道overload,但没有覆盖的概念,甚至有时把覆盖也说成重载。
现在把通过查找资料,学习到的重载与覆盖的知识总结一下。
1、 重载——(静态联编)
函数名相同,但参数列表不同(参数个数不同,参数的类型不同,或者两者兼有)。对返回值无要求。
注2:仅返回值类型不同,不能认为是函数重载。
可以重载的,可以是类的成员函数,也可以普通函数,也可以重载运算符。
在编译的时候,根据参数列表判断调用哪个函数。
2、 覆盖——(动态联编)
子类重写父类的虚函数的一种形式,实现多态。
函数名,参数列表完全相同、返回值也相同。
可以覆盖的,只能是子类重写父类的虚函数。
只有在运行阶段才能确定调用的是哪个函数。即面向对象的多态特性,即override。
面向对象的几个基本概念
多态:目的实现接口重用。
继承:实现代码重用。
封装:实现代码的模块化。
3、 两者对比总结:
| 重载 | 覆盖 |
作用域 | 作用域相同,同一个类,或同为一个全局函数 | 在不同作用域中,一个是在父类,一个是在子类。 |
函数名 | 完全相同 | 完全相同 |
参数列表 | 必定不同,可以是参数类型,参数个数,参数类型和个数 | 个数和类型完全相同 |
返回值类型 | 对返回值类型无要求,可以相同,可以不同,但若仅返回值不同,不能实现重载 | 返回值类型也必须相同 |
是否是virtual | 不是 | 基数的函数必须是virtual |
编译方式 | 静态联编(在编译阶段确定调用哪个函数) | 动态联编(在运行阶段才能确定调用哪个函数) |
总之,override与overload的一个最大的区别就是作用域不同,以及函数原型是否相同.
override: 覆盖是子类重写父类的虚方法的一种形式。
overload: 重载是值允许存在重名的多个方法。而这些函数的参数列表不同(或者是参数
的个数不同、或者是参数的类型不同或者两者都不同)。
注:因本人水平有限,若不当之处欢迎大家指正。