函数重载、函数覆盖以及函数隐藏

数重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或者两者都不相同),函数重载是发生在同一个类中。调用时,根据参数的不同进行调用。同时编译器在编译期间就确定了要调用的函数,或者说这是一种早期绑定。同时,函数重载与多态无关。

 

函数覆盖:有的书也称为函数重写(override)是指子类重新定义基类虚函数的方法

  构成函数覆盖的条件是:

 (1)基类的函数必须是虚函数(使用virtual关键字进行声明)

 (2)发生覆盖的两个函数要分别位于派生类和基类中。

 (3)函数名称与参数列表完全相同。

由于C++多态性是通过虚函数来实现的,所以函数覆盖总是和多态联系在一起的。并且是程序运行时才确定要调用的函数,这是动态绑定,或者称为后期绑定。

 

函数隐藏:是指子类中具有和父类(基类)同名的函数,但并不考虑参数列表是否相同,从而在子类中隐藏了父类的同名函数。

     函数隐藏有以下情况:

 (1)子类函数和父类函数完全相同(函数名和参数列表完全相同),只是基类的函数没有使用virtual关键字,此时基类的函数将被隐藏。

  (2)子类函数与父类函数名相同,但是参数列表不同,在这种情况下,无论父类的函数是否声明为virtual,父类的函数都将被隐藏。

举例如下:

上述程序就是一种典型的函数覆盖。

运行结果是:

fish bubble

 

当我们把父类的breathe函数前的virtual去掉,再次运行程序,发现结果为:fish bubble

但是此时是函数隐藏。

另外,当函数隐藏发生时,如果在子类的同名函数中想要调用基类的被隐藏函数,可以使用“基类名::函数名(参数)”的语法形式。

 现举例如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章