函數重載、函數覆蓋以及函數隱藏

數重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或者兩者都不相同),函數重載是發生在同一個類中。調用時,根據參數的不同進行調用。同時編譯器在編譯期間就確定了要調用的函數,或者說這是一種早期綁定。同時,函數重載與多態無關。

 

函數覆蓋:有的書也稱爲函數重寫(override)是指子類重新定義基類虛函數的方法

  構成函數覆蓋的條件是:

 (1)基類的函數必須是虛函數(使用virtual關鍵字進行聲明)

 (2)發生覆蓋的兩個函數要分別位於派生類和基類中。

 (3)函數名稱與參數列表完全相同。

由於C++多態性是通過虛函數來實現的,所以函數覆蓋總是和多態聯繫在一起的。並且是程序運行時才確定要調用的函數,這是動態綁定,或者稱爲後期綁定。

 

函數隱藏:是指子類中具有和父類(基類)同名的函數,但並不考慮參數列表是否相同,從而在子類中隱藏了父類的同名函數。

     函數隱藏有以下情況:

 (1)子類函數和父類函數完全相同(函數名和參數列表完全相同),只是基類的函數沒有使用virtual關鍵字,此時基類的函數將被隱藏。

  (2)子類函數與父類函數名相同,但是參數列表不同,在這種情況下,無論父類的函數是否聲明爲virtual,父類的函數都將被隱藏。

舉例如下:

上述程序就是一種典型的函數覆蓋。

運行結果是:

fish bubble

 

當我們把父類的breathe函數前的virtual去掉,再次運行程序,發現結果爲:fish bubble

但是此時是函數隱藏。

另外,當函數隱藏發生時,如果在子類的同名函數中想要調用基類的被隱藏函數,可以使用“基類名::函數名(參數)”的語法形式。

 現舉例如下:

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