C++ override和overload的区别

来源:互联网 发布:淘宝商城儿童女装坎肩 编辑:程序博客网 时间:2024/05/21 17:28

1overload——重载,override——覆盖(有一些人翻译成重写或覆写)。

 

学习C++这么久了,才发现自己一直只知道overload,但没有覆盖的概念,甚至有时把覆盖也说成重载。

现在把通过查找资料,学习到的重载与覆盖的知识总结一下。

 

1、  重载——(静态联编)

函数名相同,但参数列表不同(参数个数不同,参数的类型不同,或者两者兼有)。对返回值无要求。

2仅返回值类型不同,不能认为是函数重载。

可以重载的,可以是类的成员函数,也可以普通函数,也可以重载运算符。

在编译的时候,根据参数列表判断调用哪个函数。

 

 

2、  覆盖——(动态联编)          

子类重写父类的虚函数的一种形式,实现多态。

函数名,参数列表完全相同、返回值也相同。

可以覆盖的,只能是子类重写父类的虚函数。

只有在运行阶段才能确定调用的是哪个函数。即面向对象的多态特性,即override

 

面向对象的几个基本概念

多态:目的实现接口重用。

继承:实现代码重用。

封装:实现代码的模块化。

 

3、  两者对比总结:

 

重载

覆盖

作用域

作用域相同,同一个类,或同为一个全局函数

在不同作用域中,一个是在父类,一个是在子类。

函数名

完全相同

完全相同

参数列表

必定不同,可以是参数类型,参数个数,参数类型和个数

个数和类型完全相同

返回值类型

对返回值类型无要求,可以相同,可以不同,但若仅返回值不同,不能实现重载

返回值类型也必须相同

是否是virtual

不是

基数的函数必须是virtual

编译方式

静态联编(在编译阶段确定调用哪个函数)

动态联编(在运行阶段才能确定调用哪个函数)

 

 

总之,overrideoverload的一个最大的区别就是作用域不同,以及函数原型是否相同.

override     覆盖是子类重写父类的虚方法的一种形式。

overload
     重载是值允许存在重名的多个方法。而这些函数的参数列表不同(或者是参数
              
的个数不同、或者是参数的类型不同或者两者都不同)。

注:因本人水平有限,若不当之处欢迎大家指正。