catalog
重载与重写
考虑这个问题前,先思考下: 什么是函数重载。
一个函数的声明,由:返回值 + 函数名 + 参数列表,3部分决定。
重载,肯定函数名是相同的。 (当然,在C语言里,是不允许有同名函数的。但在C++里是允许的)
返回值,无限制!! 只要函数参数不冲突,返回值相同与否都可以 )
这一点,完全不需要去死记!!! 你可以从逻辑上思考一下。
假如有:int func(); 和 void func()
,我们直接去调用:func()
这显然是有歧义的,因为函数的返回值 可以不接收。
即,当函数参数相同时,int func(int, double); 和 T func(int, double);
不管你的T是什么,都是错误的!!!
因为,一个函数的唯一性标识,就是:函数名 + 参数列表
故,函数重载,是针对的“函数参数(类型、个数)”的不同。
即所有的函数重载:
- 函数名都相同
- 返回值 随意(只要: 函数参数不同即可)
- 函数参数不同。
即,只要一个编译正确的程序。 他里面,所有的同名函数,都叫做: 重载!!!
这些同名的函数,他们的函数列表 一定都是不同的。(返回值随意。)
在规则上: 函数重写,其实和重载,是完全不一样的。
但在标识上,两者需要同时考虑(把virtual去掉,当成普通函数!)
函数重写:
- 该函数,在Fa父类里,必须是virtual虚函数
- (函数返回值 + 函数名 + 参数列表),必须完全一致!!
class FA{
void f();
void f(int);
// FA里的f函数,只要满足函数重载即可!! 不能有`int f()`
}
class SON : public FA{
int f();
int f(int);
// SON里的f函数,和FA里的。没有任何关系!!!