您好,登錄后才能下訂單哦!
這篇文章主要介紹了C++函數重載、隱藏與覆蓋重寫的方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇C++函數重載、隱藏與覆蓋重寫的方法是什么文章都會有所收獲,下面我們一起來看看吧。
定義:
C++規定在同一作用域中,例如一個類的成員函數之間,多個函數的名稱相同,但是各個函數的形式參數(指參數的個數、類型或者順序)不同時,構成函數重載。
代碼示例
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); // 非重載,一起編譯會提示錯誤,僅僅返回值不同編譯無法區分使用的是那個重載函數
總結
前提:函數名稱相同,即要求是同名函數;
重載作用域:函數重載發生在橫向水平的同一作用域,例如一個類成員函數之間的重載、全局函數之間的重載;
重載類型:無論是類的靜態成員函數,還是類的普通成員函數,亦或是普通的函數,都可以形成重載;
重載要素:函數返回值類型函數重載無任何關系,僅僅返回值不同,形參相同的情況,會被禁止重載;
定義
函數隱藏是說,在不同作用域中,定義的同名函數構成函數隱藏(僅僅要求函數名稱相同,對于返回值和形式參數不做更多要求,并且對于是否是虛函數也不做要求)。例如派生類同名成員函數屏蔽與其基類的同名成員函數,以及屏蔽同名全局外部函數。(經常有人隱藏和覆蓋重寫弄混,所以提前說下,如果在派生類中存在與基類同名的虛函數,并且返回值、形參都相同,則構成函數重寫)。
代碼示例
#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
總結
前提:函數名稱相同,即要求是同名函數;
作用域:不在同一個橫向的作用域(分別位于派生類與基類的縱向作用域);
要素:返回類型可同可不同,參數亦可同可不同;
虛函數:
參數不同,此時無論有無virtual關鍵字,基類的函數將被隱藏;
參數相同的情況下
此時基類函數無virtual則屬于函數隱藏,后續無法繼續基于此利用這個函數的多態性;
如果是virtual則屬于函數重寫,繼續多態性的保留;
定義
函數的覆蓋和重寫是一個意思的兩個叫法,同時他的作用域也和函數隱藏相同,其實可以這么看,函數覆蓋和函數隱藏共同構建了在具有集成關系的縱向作用域里面的同名函數的不同衍變,只不過函數覆蓋的條件更加嚴格些。
在介紹函數隱藏的時候,為了弄清楚函數隱藏與覆蓋重寫,也簡單描述了函數覆蓋。這里再進一步進行描述下:派生類中與基類中,同名函數的返回值類型、參數的都相同,并且基類中定義為虛函數的情況下,構成虛函數覆蓋,也叫虛函數重寫。
代碼示例
#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
附:令人迷惑的隱藏規則
C++的隱藏規則使問題復雜性陡然增加,這里“隱藏”是指派生類的函數屏蔽了與其同名的基類函數,規則如下:
(1)如果派生類的函數與基類的函數同名,但是參數不同。此時,不論有無virtual關鍵字,基類的函數將被隱藏(注意別與重載混淆)。
(2)如果派生類的函數與基類的函數同名,并且參數也相同,但是基類函數沒有virtual關鍵字。此時,基類的函數被隱藏(注意別與覆蓋混淆)。
關于“C++函數重載、隱藏與覆蓋重寫的方法是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“C++函數重載、隱藏與覆蓋重寫的方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。