「隱藏」是指派生類的函式遮蔽了與其同名的基類函式,具體規則:
如果派生類的函式與
基類的函式同名,但是引數不同。此時,若基類無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.方法名 呼叫父類中的方法 為什麼重寫?子類為了滿足或者擴充套件自身的需求,對父類的方法進行了...