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

干貨:三大實(shí)例講解三種C++運(yùn)算符重載

C++之操作重載符學(xué)習(xí)的總結(jié)(二)
C++之操作符重載學(xué)習(xí)的總結(jié)
C++之重載函數(shù)學(xué)習(xí)總結(jié)
C++基礎(chǔ)知識之函數(shù)1
Python 重載與重寫的概念

評論