天天看點

C++中函數重載、覆寫與隐藏的差別

重載(overload):指函數有不同的參數表,對同名函數的名稱做修飾,然後這些同名函數就構成了不同的函數。在同一可通路區域内被聲明的幾個具有不同參數清單(參數的類型,個數,順序不同)的同名函數,程式會根據不同的參數清單來确定調用哪個函數。對于重載函數的調用,在編譯期間就已經确定,是靜态的,它們的位址在編譯期間就綁定了與多态無關。另外,重載不關心函數的傳回類型。

1) int test(int a);

2) int test(int a, int b);

3) float test(int a);

上面的例子中,1)和2)是重載關系,2)和3)是重載關系,但是1)和3)不是重載關系,因為它們參數完全相同。

成員函數被重載的特征歸納如下:

1) 相同的範圍(同一個類中)

2) 函數名字相同

3) 參數不同(類型,個數,順序)

4) virtual關鍵字可有可無

覆寫(override):是指派生類中存在重新定義基類的虛函數,其函數名,參數清單,傳回值類型必須同父類中被覆寫的函數嚴格一緻。派生類中的覆寫函數和基類中的被覆寫函數隻是函數體不同。當子類重新定義了父類的虛函數後,父類指針根據賦給它的的不同的子類指針,動态的調用屬于子類的虛函數,這樣的調用在編譯期間是無法确定的(調用的子類的虛函數的位址無法給出)。是以,虛函數的位址是在運作期間綁定的。

覆寫的特征總結如下:

1)基類函數必須有virtual關鍵字

2)函數名字相同

3)有完全相同的參數

4)不同的範圍(分别位于基類和派生類)

隐藏/屏蔽(hide):指派生類的函數屏蔽了與其同名的基類函數。其規則如下:

1)必須分别位于派生類和基類中

2)必須同名

3)如果派生類的函數與基類的函數同名,但是參數不同,則無論有無virtual關鍵字,基類的函數都将被隐藏。

4)如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual,此時基類的函數被隐藏。(如果有virtual就是函數覆寫了)

隐藏一詞可以這麼了解:在調用一個類的成員函數的時候,編譯器會沿着類的繼承鍊逐級的向上查找函數的定義,如果找到了那麼就停止查找了,是以如果一個派生類和一個基類都有同一個同名(暫且不論參數是否相同)的函數,而編譯器最終選擇了在派生類中的函數,那麼我們就說這個派生類的成員函數"隐藏"了基類的成員函數,也就是說它阻止了編譯器繼續向上查找函數的定義.

繼續閱讀