函式的覆蓋(override)與隱藏

2021-06-21 16:17:01 字數 1055 閱讀 9128

「隱藏」是指派生類的函式遮蔽了與其同名的基類函式,具體規則:

如果派生類的函式與

基類的函式同名,但是引數不同。此時,若基類無virtual

關鍵字,基類的函式將被隱藏。(注意別與

過載混淆,雖然函式名相同引數不同應稱之為過載,但這裡不能理解為過載,因為派生類和基類不在同一名字空間

作用域內。這裡理解為隱藏)  如果派生類的函式與基類的函式同名,但是引數不同。此時,若基類有virtual關鍵字,基類的函式將被隱式繼承到派生類的中。vtable此時派生類vtable中的函式指向基類版本的函式位址。同時這個新的函式版本新增到派生類中,作為派生類的

過載版本。但在基類

指標實現多型呼叫函式方法時,這個新的派生類函式版本將會被隱藏。  如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字。此時,基類的函式被隱藏。(注意別與覆蓋混淆,這裡理解為隱藏)。  如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式有virtual關鍵字。此時,基類的函式不會被「隱藏」。 構成

函式覆蓋的條件為:

n  基類函式必須是

虛函式(使用virtual

關鍵字進行宣告)。

n 發生覆蓋的兩個函式要分別位於派生類和基類中。

n 函式名稱與

引數列表必須完全相同。

由於c++的

多型性是通過

虛函式來實現的,所以函式的覆蓋總是和多型關聯在一起。在

函式覆蓋的情況下,

編譯器會在執行時根據物件的實際型別來確定要呼叫的函式。

初學者很容易把函式的隱藏與函式的覆蓋、

過載相混淆,我們看下面兩種函式隱藏的情況:

(1)派生類的函式與基類的函式完全相同(函式名和

引數列表都相同),只是基類的函式沒有使用virtual關鍵字。此時基類的函式將被隱藏,而不是覆蓋(請參照上文講述的

函式覆蓋進行比較)。

(2)派生類的函式與基類的函式同名,但

引數列表不同,在這種情況下,不管基類的函式宣告是否有virtual關鍵字,基類的函式都將被隱藏。注意這種情況與

函式過載的區別,過載發生在同乙個類中。

Overload與Override(覆蓋)的區別

過載方法 重寫方法 方法簽名引數列表必須修改 不能修改 返回型別可以修改 子類返回值 層次 父類返回值 層次 丟擲異常可以修改 子類丟擲異常範圍 父類丟擲異常範圍 方法許可權修飾符可以修改 子類許可權 父類許可權 測試 如下 parent類 public class parent child類 pu...

C 過載 覆蓋(override)與隱藏

c 過載 覆蓋 override 與隱藏 稍微懂得點oop的人都知道過載,那是多型性的重要體現!可是在c 中你能分清成員函式的過載 覆蓋嗎?這個好像也不難,過載存在與同乙個類中,而覆蓋存在於派生類於基類中!可是如果再加上隱藏呢?說實話,以前我從來沒有聽說過這個概念!也不知道自己曾經捏造的程式,出了多...

函式的複寫 override

函式的複寫 override 也叫覆蓋或者重寫 作用 修改父類方法 語法特徵 1 在具有父子關係的兩個類當中 2 父類和子類各有乙個函式,這兩個函式的定義 返回值型別 函式名和引數列表 完全相同 super.方法名 呼叫父類中的方法 為什麼重寫?子類為了滿足或者擴充套件自身的需求,對父類的方法進行了...