C++ 中函數(shù)重載、覆蓋與隱藏詳解
在C++語言中,函數(shù)扮演著很重要的角色,不管面向過程設(shè)計,還是基于對象設(shè)計;不管是面向?qū)ο缶幊蹋€是基于泛型編程,函數(shù)都可以隨處而見。在談?wù)揅++中的函數(shù)重載、覆蓋和隱藏之前,先回顧下函數(shù)的基礎(chǔ)知識。
函數(shù)的聲明包括函數(shù)的返回值類型,函數(shù)名稱,參數(shù)列表(參數(shù)的類型、參數(shù)的個數(shù)、參數(shù)的順序)。例如,聲明一個兩個整數(shù)之和的函數(shù),int iAdd(int iNum1,int iNum2);而函數(shù)的定義可以理解為對函數(shù)功能的詳盡而準確的解說,通俗點,就是實現(xiàn)函數(shù)“how to do?”的效能。兩個整數(shù)之和函數(shù)的定義如下:
1
2
3
4
|
int iAdd( int iNum1, int iNum2) { return (iNum1+iNum2); } |
仔細觀察函數(shù)的聲明和定義,我們不難發(fā)現(xiàn),函數(shù)的定義就是除掉函數(shù)聲明后面的分號,換之成大括號,在大括號里面實現(xiàn)函數(shù)的功能。雖然在某些情況下,可以容許不對函數(shù)進行聲明,只需要對函數(shù)定義,就能調(diào)用函數(shù)了。但是,強烈建議養(yǎng)成先聲明函數(shù),然后再定義函數(shù),最后在調(diào)用函數(shù)的良好習(xí)慣。關(guān)于函數(shù)的基礎(chǔ)知識,暫時論述到這。
現(xiàn)在,進入本文的主題。函數(shù)重載(function overload),它是在同一可訪問區(qū)域內(nèi)部聲明具有幾個不同參數(shù)列(參數(shù)的類型、參數(shù)的個數(shù),參數(shù)的順序)的相同函數(shù)名稱的一種機制,函數(shù)的調(diào)用是根據(jù)不同的參數(shù)類型和最佳匹配原則確定最終使用那個函數(shù)。函數(shù)覆蓋(function override)是在派生類中完全一致性地聲明了父類中的函數(shù),區(qū)別在于函數(shù)定義中的大括號之間的內(nèi)容可以不同,并且該函數(shù)在父類中有關(guān)鍵字virtual標識;函數(shù)隱藏(function hide)是指在派生類中函數(shù)與父類函數(shù)完全一致,但是在父類中該函數(shù)沒有關(guān)鍵字virtual標識,或者是指在派生類中函數(shù)與父類的函數(shù)名相同,參數(shù)列表不一樣,父類中的該函數(shù)可有也可無關(guān)鍵字virtual標識。
函數(shù)重載的特征:相同的范圍內(nèi)(在同一個類中),函數(shù)的名稱相同,參數(shù)列表不同,virtual關(guān)鍵字可有可無;函數(shù)覆蓋的特征:在不同的范圍內(nèi)(父類與派生類),函數(shù)的名字相同,參數(shù)列表相同,父類函數(shù)必須有關(guān)鍵字virtual;函數(shù)隱藏的特征:在不同范圍內(nèi)(父類與派生類),函數(shù)的名字相同,參數(shù)列表相同,但是父類函數(shù)沒有關(guān)鍵字virtual或者,參數(shù)列表不相同,父類函數(shù)中virtual關(guān)鍵字可有可無。
為了直觀地理解,請看下面的代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#include<iostream> using namespace std; class A { public : void print( int iNum) { cout<< "在類A中,參數(shù)類型是整型" <<endl; } void print( float fNum) { cout<< "在類A中,參數(shù)類型是單精度浮點型" <<endl; } virtual void print( void ) { cout<< "在類A中,參數(shù)類型是空類型" <<endl; } }; class B: public A { public : void print( void ) { cout<< "在類B中,參數(shù)類型是空類型" <<endl; } void print( int iNum) { cout<< "在類B中,參數(shù)類型是整型" <<endl; } }; int main() { A a; B b; //函數(shù)的重載 a.print(); a.print(1); a.print(1.0f); //函數(shù)的覆蓋 b.print(); //函數(shù)的隱藏 b.print(1); return 0; } |
運行結(jié)果是:
1
2
3
4
5
|
在類A中,參數(shù)類型是空類型 在類A中,參數(shù)類型是整型 在類A中,參數(shù)類型是單精度浮點型 在類B中,參數(shù)類型是空類型 在類B中,參數(shù)類型是整型 |
通過上述代碼和運行的結(jié)果,簡明地知道了函數(shù)重載,覆蓋和隱藏。恰當里利用這些特性,可以編寫出更加有效、清晰和精簡的代碼。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/wangloveall/article/details/6997831