复习:函数重载、重写、重定义

函数重载:
作用

在调用同名函数时,针对不同的输入参数,就能调用不同的处理函数

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,则会隐藏父类旧函数,实现子类新函数的重定义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值