(1)重载
- 重载是指在同一个作用域内,两个函数的函数名可以相同,但是参数不能完全相同
- 可以是参数类型不同,也可以是参数个数不同,
- 返回值不影响重载,即不同返回值的函数,其他都相同则不能重载
- 重载的实现原理:编译器在编译函数时,会根据函数名以及参数类型和个数对函数重命名
int fun(int a) {
return a;
}
void fun(int a, int b) { // 函数重载
cout << a*b << endl;
}
(2)重写,也叫覆盖
- 重写是指在继承关系中,子类中定义了一个与父类函数名和参数相同的函数
- 函数位于不同的范围,分别位于基类和派生类中
- 函数名必须相同
- 参数必须相同
- 返回值可以不相同,但是必须是父子关系的指针或引用
- 基类函数必须有virtual关键字
- 通过重写可以实现动态多态
(3)重定义(隐藏)
- 指的是在继承关系中,子类实现了一个和父类名字一样的函数,这样子类的函数就把父类的函数屏蔽了
- 如果派生类中的函数与基类的函数名相同,但是参数不同,此时,不管基类中是否有virtual关键字修饰,基类的函数被隐藏。
- 如果派生类中的函数与基类的函数名相同,参数也相同,此时,如果基类中无virtual关键字修饰,基类的函数被隐藏。
struct Base {
int f1();
};
struct Child : Base {
int f1(int a); // 隐藏基类的f1()
};
// 调用
Base b; Child c;
b.f1(); // 正确:访问Base中的成员
c.f1(10); // 正确:访问Child中的成员
c.f1(); // 错误:参数列表为空的f1被隐藏了,无法访问
c.Base::f1(); // 正确:访问Base中的f1