在C++中我們經常會遇見“重載、重定義、重寫”的概念,三個概念名字很像,很容易混淆,今天我們對三者進行一個區分。
1.重載(overload)
函數重載是函數的一種特殊情況,其特點是:
(1)在同一作用域(全局作用域、局部作用域、類作用域);
(2)函數名相同;
(3)形參列表(參數個數、參數類型、參數順序)必須不同;
(4)返回值可以不同;
(5)virtual關鍵字可有可無。
舉例:
下面,我們看一看這種情況能否構成重載?
根據上面我們所說的重載的特點,看起來這兩個函數好像還可以構成重載,但實際上是不可以的,原因是:僅僅返回值類型不同,不能構成重載!
2.重寫(覆蓋)
覆蓋是C++多態的實現基礎,指派生類重新定義基類的虛函數。其特點是:
(1)在不同的作用域中(分別在基類和派生類中);
(2)函數名相同;
(3)參數相同;
(4)返回值類型相同(協變例外:基類中的虛函數返回Base*,派生類中返回Derived*);
(5)基類函數必須有virtual關鍵字,派生類可有可無(因為派生類繼承基類后就會有該關鍵字),但基類不能有static關鍵字;
(6)訪問修飾符可以不同(例如基類virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的)。
舉例:
3.重定義(隱藏)
在繼承體系中,子類和父類中有同名成員,子類成員將屏蔽父類對成員的直接訪問。(在子類成員中,可以使用基類: :基類成員訪問)。重定義的特點如下:
(1)在不同的作用域中(分別在基類和派生類中);
(2)函數名相同;
(3)返回值可以不同;
(4)在基類和派生類中,只要不構成重寫就是重定義(即:參數相同時:基類沒有關鍵字virtual,基類的函數被隱藏;參數不同時:無論基類有無關鍵字virtual,基類函數都被隱藏)。
舉例:
-
函數
+關注
關注
3文章
4380瀏覽量
64848 -
C++
+關注
關注
22文章
2119瀏覽量
75284 -
重載
+關注
關注
0文章
8瀏覽量
2855
發布評論請先 登錄
關于C++中的函數重載機制
關于C++虛函數是否必須重寫
漫談java中重載與重寫的不同
C++程序設計教程之運算符重載的詳細資料說明

評論