c 的過載 覆蓋和遮蔽(隱藏)

2021-06-22 08:19:37 字數 1390 閱讀 6908

為了說明這三者的區別,引入函式簽名的概念

函式簽名主要包括1、函式名;2、引數的個數、資料型別和順序

但是注意,函式簽名不包括返回值

在同乙個類中,或者在頂層函式(與main函式同層)中,如果

(1)函式名相同

(2)函式簽名不同

則就是函式過載。函式過載對函式返回值無要求,即返回值可以相同也可以不相同。

例如:函式int function(int, char)、int function(char, int)、int function(int)、int function(char)這四個函式相互之間構成了函式過載。

注意,函式過載返回值可以相同,也可以不相同!

例如:函式int function(int, char)、char function(int)構成函式過載

函式過載要求函式簽名必須不同,下面的例子不是函式過載,這兩個函式函式簽名相同,會被認作是同乙個函式,但是返回值又不相同,這樣子的話編譯器會報錯:無法過載僅按返回型別區分的函式。

例如:函式int function(int, char)、char(int, char) 這不算是函式過載

函式覆蓋發生在繼承層次之中。覆蓋需要滿足的條件如下:

(1)發生覆蓋的函式必須分別在父類和子類中

(2)子類函式與父類函式的函式簽名相同

(3)父類函式必須是虛函式

覆蓋對函式返回值同樣沒有要求,可以相同,也可以不同,但是很少有編譯器支援這種特性(vs2010就不支援這種特性,親測)

class a

……};

class b::public a ……

};int main()

上面的例子就是乙個覆蓋,如果上面沒有關鍵字virtual,那麼呼叫的將會是class a 的函式

函式覆蓋說的就是多型。

遮蔽是指子類中具有與父類同名的函式(不管引數列表是否相同),除去函式覆蓋的情況。

遮蔽的條件:

(1)子類的成員函式與父類的成員函式名必須相同

(2)子類的虛函式無法覆蓋父類的虛函式

遮蔽可以這麼理解:

(1)子類成員函式與父類成員函式具有相同的函式名

(2)除去覆蓋的情況

遮蔽要求函式名一定相同,函式簽名可以相同也可以不相同。

也就是說,繼承層次中,父類與子類同名函式要麼是覆蓋,要麼是遮蔽。

上例中如果沒有virtual關鍵字,就屬於遮蔽情況。或者上例中,子類function函式與父類函式函式簽名不同,則也是遮蔽情況。

總結:(1)函式過載發生在同乙個類或頂層函式中,同名的函式具有不同的引數列表

(2)函式覆蓋發生在繼承層次中,該函式在父類中必須是virtual,而子類的該函式必須與父類具有相同的引數列表

(3)函式遮蔽(隱藏)發生在繼承層次中,父類和子類同名的函式中,不屬於函式覆蓋的都屬於函式遮蔽

C 過載 覆蓋 和隱藏

這幾個概念都有乙個共同點 函式名稱相同,所以不免讓人混淆,大致的區別如下 過載 overload 必須在乙個域中,函式名稱相同但是函式引數不同,過載的作用就是同乙個函式有不同的行為,因此不是在乙個域中的函式是無法構成過載的,這個是過載的重要特徵 覆蓋 override 覆蓋指的是派生類的虛函式覆蓋了...

C 過載 覆蓋和隱藏

過載 覆蓋和隱藏 共同點 函式名稱相同。1 過載 必須在乙個域內,函式名稱相同但是函式引數不同。過載的作用就是同乙個函式有不同的行為。過載完全是乙個編譯時 或靜態 的概念。如果宣告了同名函式,編譯器會在編譯時處理這些同名函式的呼叫問題,確定呼叫哪乙個函式,執行時不 涉及呼叫過載函式的額外開銷或決定。...

c 過載 覆蓋和隱藏

成員函式過載的特徵 1 相同的範圍 在同乙個類中 2 函式名字相同 3 引數不同 4 virtual關鍵字可有可無 函式覆蓋指的是派生類函式覆蓋基類函式,1 要求不同的範圍 分別位於派生類與基類中 2 函式名字要求相同 3 引數要求相同 4 基類和拿書必須有virtual關鍵字 隱藏是指派生類的函式...