一、覆盖(重写)
如果子类中有与父类的虚函数名相同的成员函数,编译器会比较两个同名函数的格式,如果完全相同,则会把子类中同名函数的地址覆盖父类的虚函数表中的记录,这种情况叫做函数覆盖或者函数重写,如果格式不相同则构成隐藏
构成函数覆盖的条件
a、在父子类之间
b、父类中的函数为虚函数
c、返回值、函数名、参数列表必须完全相同
d、返回值类型相同,或者子类函数的返回值可以向父类函数的返回值作隐式强转换且有继承关系,也可构成函数覆盖
二、重载
在同一作用域下,函数名相同,参数列表不同(参数的个数、类型)的函数构成重载关系
函数重载与返回值类型、参数名无关
只有同一个作用域下同名不同参的函数构成重载关系
而不同作用域下的同名函数遵循名字隐藏原则
函数重载的判断依据
1. 函数形参的个数
2. 函数形参的类型
3. 形参的顺序
4. 不能把返回值作为函数重载的条件,原因是编译器在编译时不会去判断函数的返回类型,函数只有调用后,编译器才会去验证返回类型,所以返回值不能作为函数重载的依据。
5. 常函数 const 可以作为函数重载判断依据,原因:重载[]运算符时,有没有const的区别是:有const只读,没有const读写都可以。
总结:
重载的特征有: 1) 相同的范围(在同一个类中);2) 函数名字相同;3) 参数不同;4) virtual关键字可有可无。
覆盖的特征有: 1) 不同的范围(分别位于派生类与基类);2) 函数名字相同;3) 参数相同;4) 基类函数必须有virtual关键字。
隐藏的特征有:1)如果派生类的函数与基类的函数同名,但是参数不同,不论有无virtual关键字,基类的函数都将被覆盖,如果派生类的函数与基类的函数同门,并且参数也相同,但是基类函数没有virtual关键字,基类的函数也将被隐蔽。