函数的重载,重写,隐藏

来源:互联网 发布:知乎周刊plus 编辑:程序博客网 时间:2024/06/14 07:30
重载:
1、在同一作用域中。
2、函数名相同、参数个数或参数类型不同,返回值可同可不同。
3重载又称为静态多态,静态绑定,静态决议等。因为要实现重载,所以C++和C的命名方式有所不同。重载主要是为了减轻程序员对函数名的记忆负担,让所有功能相似的函数使用同一名字。
4、任何程序都仅有一个 main 函数的实例。main 函数不能重载。
5、函数重载和重复申明的区别:
如果两个函数声明的返回类型和形参表完全匹配,
则将第二个函数声明视为第一
个的重复声明。如果两个函数的形参表完全相同,但返回类型不同,则第二个声明
是错误的。
6、重载与作用域:
一般的作用域规则同样适用于重载函数名。如果局部地声明一个函数,则该函数
将屏蔽而不是重载在外层作用域中声明的同名函数。由此推论,每一个版本的重
载函数都应在同一个作用域中声明。

隐藏:
1、在不同作用域中,分别在基类和派生类中。
2、隐藏只要求函数名相同就行。
3、在派生类中只要不是重写就是隐藏。
4、隐藏是因为在子类中定义了与基类同名的函数,而将基类的函数隐藏掉,要想访问基类的函数,则必须加作用域限定符。

覆盖(重写):
1、不在同一作用域中,分别在父类和子类中
2、要求函数名相同函数参数列表相同返回值也相同(协变除外)。
3、基类函数必须是虚函数(virtual)。
4、访问修饰符可以不同。
5覆盖是指父类中的虚函数在子类中被重新定义,所以在子类对象的虚函数表中将由子类中重新定义的函数地址覆盖掉原来父类中虚函数的地址。协变是指虚函数的返回值可以是本类类型的指针或引用。动态多态又称动态绑定、动态决议。


覆盖与隐藏的区别:
覆盖是指派生类函数覆盖基类函数,特征是: 
(1)不同的范围(分别位于派生类与基类); 
(2)函数名字相同; 
(3)参数相同; 
(4)基类函数必须有virtual 关键字。
 
“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下: 
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。 
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
隐藏后, 即在子类中看不到父类的函数。





1 0