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