您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。
定義:
C++規(guī)定在同一作用域中,例如一個(gè)類(lèi)的成員函數(shù)之間,多個(gè)函數(shù)的名稱(chēng)相同,但是各個(gè)函數(shù)的形式參數(shù)(指參數(shù)的個(gè)數(shù)、類(lèi)型或者順序)不同時(shí),構(gòu)成函數(shù)重載。
代碼示例
int test(int a); int test(int a, double b); int test(double b, int a); int test(int a, const char ** c); void test(int a, const char ** c); // 非重載,一起編譯會(huì)提示錯(cuò)誤,僅僅返回值不同編譯無(wú)法區(qū)分使用的是那個(gè)重載函數(shù)
總結(jié)
前提:函數(shù)名稱(chēng)相同,即要求是同名函數(shù);
重載作用域:函數(shù)重載發(fā)生在橫向水平的同一作用域,例如一個(gè)類(lèi)成員函數(shù)之間的重載、全局函數(shù)之間的重載;
重載類(lèi)型:無(wú)論是類(lèi)的靜態(tài)成員函數(shù),還是類(lèi)的普通成員函數(shù),亦或是普通的函數(shù),都可以形成重載;
重載要素:函數(shù)返回值類(lèi)型函數(shù)重載無(wú)任何關(guān)系,僅僅返回值不同,形參相同的情況,會(huì)被禁止重載;
定義
函數(shù)隱藏是說(shuō),在不同作用域中,定義的同名函數(shù)構(gòu)成函數(shù)隱藏(僅僅要求函數(shù)名稱(chēng)相同,對(duì)于返回值和形式參數(shù)不做更多要求,并且對(duì)于是否是虛函數(shù)也不做要求)。例如派生類(lèi)同名成員函數(shù)屏蔽與其基類(lèi)的同名成員函數(shù),以及屏蔽同名全局外部函數(shù)。(經(jīng)常有人隱藏和覆蓋重寫(xiě)弄混,所以提前說(shuō)下,如果在派生類(lèi)中存在與基類(lèi)同名的虛函數(shù),并且返回值、形參都相同,則構(gòu)成函數(shù)重寫(xiě))。
代碼示例
#include <iostream> using namespace std; class Parent { public: void test(int a) { cout<<"this is Parent"<<endl; } }; class Son: public Parent { public: void test(int a) { cout<<"this is Son hide Parent function"<<endl; } }; int main(int argc, char ** argv) { Son son; son.test(1); return 0; }
輸出如下
root@localhost override [master] $ g++ --std=c++11 test_hide.cpp root@localhost override [master] $ ./a.out this is Son hide Parent function
總結(jié)
前提:函數(shù)名稱(chēng)相同,即要求是同名函數(shù);
作用域:不在同一個(gè)橫向的作用域(分別位于派生類(lèi)與基類(lèi)的縱向作用域);
要素:返回類(lèi)型可同可不同,參數(shù)亦可同可不同;
虛函數(shù):
參數(shù)不同,此時(shí)無(wú)論有無(wú)virtual關(guān)鍵字,基類(lèi)的函數(shù)將被隱藏;
參數(shù)相同的情況下
此時(shí)基類(lèi)函數(shù)無(wú)virtual則屬于函數(shù)隱藏,后續(xù)無(wú)法繼續(xù)基于此利用這個(gè)函數(shù)的多態(tài)性;
如果是virtual則屬于函數(shù)重寫(xiě),繼續(xù)多態(tài)性的保留;
定義
函數(shù)的覆蓋和重寫(xiě)是一個(gè)意思的兩個(gè)叫法,同時(shí)他的作用域也和函數(shù)隱藏相同,其實(shí)可以這么看,函數(shù)覆蓋和函數(shù)隱藏共同構(gòu)建了在具有集成關(guān)系的縱向作用域里面的同名函數(shù)的不同衍變,只不過(guò)函數(shù)覆蓋的條件更加嚴(yán)格些。
在介紹函數(shù)隱藏的時(shí)候,為了弄清楚函數(shù)隱藏與覆蓋重寫(xiě),也簡(jiǎn)單描述了函數(shù)覆蓋。這里再進(jìn)一步進(jìn)行描述下:派生類(lèi)中與基類(lèi)中,同名函數(shù)的返回值類(lèi)型、參數(shù)的都相同,并且基類(lèi)中定義為虛函數(shù)的情況下,構(gòu)成虛函數(shù)覆蓋,也叫虛函數(shù)重寫(xiě)。
代碼示例
#include <iostream> using namespace std; class Parent { public: virtual void test(int a) { cout<<"this is Parent"<<endl; } }; class Son: public Parent { public: void test(int a) { cout<<"this is Son Override Parent function"<<endl; } }; int main(int argc, char ** argv) { Son son; son.test(1); return 0; }
輸出如下:
root@localhost override [master] $ g++ --std=c++11 test_override2.cpp root@localhost override [master] $ ./a.out this is Son Override Parent function
附:令人迷惑的隱藏規(guī)則
C++的隱藏規(guī)則使問(wèn)題復(fù)雜性陡然增加,這里“隱藏”是指派生類(lèi)的函數(shù)屏蔽了與其同名的基類(lèi)函數(shù),規(guī)則如下:
(1)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類(lèi)的函數(shù)將被隱藏(注意別與重載混淆)。
(2)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名,并且參數(shù)也相同,但是基類(lèi)函數(shù)沒(méi)有virtual關(guān)鍵字。此時(shí),基類(lèi)的函數(shù)被隱藏(注意別與覆蓋混淆)。
關(guān)于“C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。