函数重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或者两者都不相同),函数重载是发生在同一个类中。调用时,根据参数的不同进行调用。同时编译器在编译期间就确定了要调用的函数,或者说这是一种早期绑定。同时,函数重载与多态无关。
函数覆盖:有的书也称为函数重写(override)是指子类重新定义基类虚函数的方法
构成函数覆盖的条件是:
(1)基类的函数必须是虚函数(使用virtual关键字进行声明)
(2)发生覆盖的两个函数要分别位于派生类和基类中。
(3)函数名称与参数列表完全相同。
由于C++多态性是通过虚函数来实现的,所以函数覆盖总是和多态联系在一起的。并且是程序运行时才确定要调用的函数,这是动态绑定,或者称为后期绑定。
函数隐藏:是指子类中具有和父类(基类)同名的函数,但并不考虑参数列表是否相同,从而在子类中隐藏了父类的同名函数。
函数隐藏有以下情况:
(1)子类函数和父类函数完全相同(函数名和参数列表完全相同),只是基类的函数没有使用virtual关键字,此时基类的函数将被隐藏。
(2)子类函数与父类函数名相同,但是参数列表不同,在这种情况下,无论父类的函数是否声明为virtual,父类的函数都将被隐藏。
举例如下:
上述程序就是一种典型的函数覆盖。
运行结果是:
fish bubble
当我们把父类的breathe函数前的virtual去掉,再次运行程序,发现结果为:fish bubble
但是此时是函数隐藏。
另外,当函数隐藏发生时,如果在子类的同名函数中想要调用基类的被隐藏函数,可以使用“基类名::函数名(参数)”的语法形式。
现举例如下: