重载、重写(覆盖)、隐藏(重定义)
重载(Overload):
1.在同一个类内
2.参数不同( 参数个数不同、参数类型不同、参数顺序不同)
3.函数名相同
4.virtual关键字可有可无
5. 如果参数是指针, 或引用,那么const修饰也可以作为重载依据
具体查看博客:https://www.cnblogs.com/qingergege/p/7609533.html
6.const的另一种情况也能形成重载:
注意:返回值不作为函数重载的依据
重写(Override)(覆盖):
1.不同类中
2.参数相同
3.函数名相同
4.基类必须有virtual
注:涉及虚表和虚表指针,虚函数指针这些;
隐藏(重定义):
(1)
1.不同类中
2.类名相同
3.参数不同
4.无论有无virtual都是隐藏
(2)
1.不同类中
2.类名相同
3.参数相同
4.无virtual(因为此时如果有virtual,那就是重写了)
编译器调用重载函数的准则:
将所有同名函数作为候选者
尝试寻找可行的候选函数
精确匹配实参
通过默认参数能够匹配实参
通过默认类型转换匹配实参
匹配失败
最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
无法匹配所有候选者,函数未定义,编译失败。
思考:当函数默认参数遇上函数重载会发生什么?
只要有二义性的就肯定连编译都不会通过;