在C++中我們經(jīng)常會遇見“重載、重定義、重寫”的概念,三個概念名字很像,很容易混淆,今天我們對三者進(jìn)行一個區(qū)分。
1.重載(overload)
函數(shù)重載是函數(shù)的一種特殊情況,其特點是:
(1)在同一作用域(全局作用域、局部作用域、類作用域);
(2)函數(shù)名相同;
(3)形參列表(參數(shù)個數(shù)、參數(shù)類型、參數(shù)順序)必須不同;
(4)返回值可以不同;
(5)virtual關(guān)鍵字可有可無。
舉例:
下面,我們看一看這種情況能否構(gòu)成重載?
根據(jù)上面我們所說的重載的特點,看起來這兩個函數(shù)好像還可以構(gòu)成重載,但實際上是不可以的,原因是:僅僅返回值類型不同,不能構(gòu)成重載!
2.重寫(覆蓋)
覆蓋是C++多態(tài)的實現(xiàn)基礎(chǔ),指派生類重新定義基類的虛函數(shù)。其特點是:
(1)在不同的作用域中(分別在基類和派生類中);
(2)函數(shù)名相同;
(3)參數(shù)相同;
(4)返回值類型相同(協(xié)變例外:基類中的虛函數(shù)返回Base*,派生類中返回Derived*);
(5)基類函數(shù)必須有virtual關(guān)鍵字,派生類可有可無(因為派生類繼承基類后就會有該關(guān)鍵字),但基類不能有static關(guān)鍵字;
(6)訪問修飾符可以不同(例如基類virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的)。
舉例:
3.重定義(隱藏)
在繼承體系中,子類和父類中有同名成員,子類成員將屏蔽父類對成員的直接訪問。(在子類成員中,可以使用基類: :基類成員訪問)。重定義的特點如下:
(1)在不同的作用域中(分別在基類和派生類中);
(2)函數(shù)名相同;
(3)返回值可以不同;
(4)在基類和派生類中,只要不構(gòu)成重寫就是重定義(即:參數(shù)相同時:基類沒有關(guān)鍵字virtual,基類的函數(shù)被隱藏;參數(shù)不同時:無論基類有無關(guān)鍵字virtual,基類函數(shù)都被隱藏)。
舉例:
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4408瀏覽量
66954 -
C++
+關(guān)注
關(guān)注
22文章
2122瀏覽量
76749 -
重載
+關(guān)注
關(guān)注
0文章
8瀏覽量
2908
發(fā)布評論請先 登錄

C++:重載、重定義和重寫的概念和區(qū)分
評論