函數重載:是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或者兩者都不相同),函數重載是發生在同一個類中。調用時,根據參數的不同進行調用。同時編譯器在編譯期間就確定了要調用的函數,或者說這是一種早期綁定。同時,函數重載與多態無關。
函數覆蓋:有的書也稱爲函數重寫(override)是指子類重新定義基類虛函數的方法
構成函數覆蓋的條件是:
(1)基類的函數必須是虛函數(使用virtual關鍵字進行聲明)
(2)發生覆蓋的兩個函數要分別位於派生類和基類中。
(3)函數名稱與參數列表完全相同。
由於C++多態性是通過虛函數來實現的,所以函數覆蓋總是和多態聯繫在一起的。並且是程序運行時才確定要調用的函數,這是動態綁定,或者稱爲後期綁定。
函數隱藏:是指子類中具有和父類(基類)同名的函數,但並不考慮參數列表是否相同,從而在子類中隱藏了父類的同名函數。
函數隱藏有以下情況:
(1)子類函數和父類函數完全相同(函數名和參數列表完全相同),只是基類的函數沒有使用virtual關鍵字,此時基類的函數將被隱藏。
(2)子類函數與父類函數名相同,但是參數列表不同,在這種情況下,無論父類的函數是否聲明爲virtual,父類的函數都將被隱藏。
舉例如下:
上述程序就是一種典型的函數覆蓋。
運行結果是:
fish bubble
當我們把父類的breathe函數前的virtual去掉,再次運行程序,發現結果爲:fish bubble
但是此時是函數隱藏。
另外,當函數隱藏發生時,如果在子類的同名函數中想要調用基類的被隱藏函數,可以使用“基類名::函數名(參數)”的語法形式。
現舉例如下: