一、重载
首先,对比C语言的函数,C++增加了重载(overloaded)、内联(inline)、const和virtual四种新机制,重载便是这四种新机制之一。类似自然语言,一词可以多义,在C++中,可以把语义、功能相似的几个函数用同一个名字表示,即函数重载。
重载的实现:可以通过函数的参数实现重载。注意:区分函数是否重载只能通过函数的参数而不能仅仅靠返回值。因为在C/C++中函数的返回值可以被忽略。
例如:void Function(void);
int Function(void);
通过int x = Function();
这里即无法判断到底调用了哪个函数。
注意:并不是函数名相同就构成了重载,全局函数和类成员函数的同名就不算重载,因为函数的作用域不同。
如:void Print(...);
class A
{
void Print(...);
}
函数的重载还应该注意的是发生隐式类型转换而导致二义性的产生。如下代码
#include<iostream> using namespace std; void output( int x); // 函数声明 void output( float x); // 函数声明 void output( int x) { cout << " output int " << x << endl ; } void output( float x) { cout << " output float " << x << endl ; } void main(void) { int x = 1; float y = 1.0; output(x); // output int 1 output(y); // output float 1 output(1); // output int 1 output(0.5); // error! ambiguous call, 因为自动类型转换 output(int(0.5)); // output int 0 output(float(0.5)); // output float 0.5 }
二、覆盖
覆盖是指派生类函数覆盖基类函数,特征是:
1、不同的范围(分别位于派生类和基类);
2、函数的名字相同;
3、参数相同;
4、基类函数必须有Virtual关键字
三、隐藏
隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
1、如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。(易与重载混淆)
2、如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。(易与覆盖混淆)
更多实例详见《高质量C++编程》
时间: 2024-11-08 20:55:53