為了說明這三者的區別,引入函式簽名的概念
函式簽名主要包括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關鍵字 隱藏是指派生類的函式...