函数重载:
作用
在调用同名函数时,针对不同的输入参数,就能调用不同的处理函数
class A {
public:
void f() {
cout << "没有参数" << endl;
}
void f(int a) {
cout << "1个参数" << endl;
}
void f(char a, int b) {
cout << "2个参数" << endl;
}
};
int main(){
A a;
a.f();
a.f(1);
a.f('a', 2);
return 0;
}
结果:
没有参数
1个参数
2个参数
条件
-
同一个作用域:重载的函数处于同一个类中,不能分别存放与子类与父类中。若存在父类或子类中,则涉及重定义或重写,而不再是重载。
-
相同的函数名:如上例中,函数名都是f
-
不同的形参列表:如上例中,形参个数、形参类型都不同
-
函数返回值可以随意
注意事项
- 重载函数的形参列表使用了默认参数时:如
int f(int a = 0){}
与int f(){}
可能会出现二义性,导致编译不通过。 - 函数名后接const:如
int f const()
与int f()
可以重载。因为const表明该函数的函数体内不能对类中的成员变量进行修改。与普通函数不同,所以可以重载。
class A {
public:
void f() {
cout << "没有参数" << endl;
}
void f(int a = 0) {
cout << "1个参数" << endl;
}
void f(char a = 'a', int b = 0) {
cout << "2个参数" << endl;
}
};
int main(){
A a;
a.f();
a.f(1);
a.f('a', 2);
return 0;
}
调用a.f();
时,无法判断是调用哪个f函数
a.f(1);
也是一样,无法判断调用哪个函数
只有a.f('a', 2);
能明确知道调用的是2个形参的f函数
函数重写:
对于基类带virtual关键字的函数,在子类中,对该函数进行重写。会隐藏掉基类的函数。
作用
用于多态的实现。
条件
- 关键字virtual:在父类声明该函数时,需带virtual关键字,后续继承的子类就不必再带virtual了
- 函数名与形参列表都要与父类声明的一模一样:因为即使函数名相同,但是形参列表不同也会被视为函数重定义,便失去了重载的作用。
- 分别存在与父类和子类中:若子类中不重写该函数,则会调用父类的该函数。
函数重定义(也叫隐藏):
函数重定义,容易与函数重载联系
作用
重新定义函数的实现。隐藏旧函数。重定义一般存在于子类中。
条件
- 在父类和子类中存在同名函数
- 该同名函数的形参列表不同:那么无需考虑是否有virtual关键字,直接隐藏父类旧函数,实现子类新函数的重定义。
- 该同名函数的新参列表相同:如果该同名函数在父类声明了virtual是虚函数,那就不叫函数重定义,而是函数重写。如果没有声明virtual,则会隐藏父类旧函数,实现子类新函数的重定义。