C++中重载、重写(覆盖)和隐藏的区别实例分析
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                C++中重载、重写(覆盖)和隐藏的区别实例分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                1.重載:重載從overload翻譯過來,是指同一可訪問區內被聲明的幾個具有不同參數列(參數的類型,個數,順序不同)的同名函數,根據參數列表確定調用哪個函數,重載不關心函數返回類型。
示例代碼如下:
| 1 2 3 4 5 6 7 8 | class A{ public: ??void test(int i); ??void test(double i); ??void test(int i, double j); ??void test(double i, int j); ??int test(int i);???????? //錯誤,非重載 }; | 
前四個互為重載函數,最后一個和第一個不是重載函數。
2.隱藏:隱藏是指派生類的函數屏蔽了與其同名的基類函數。注意只要同名函數,不管參數列表是否相同,基類函數都會被隱藏。
#include<iostream> using namespace std; class A { public:void fun1(int i, int j) { cout << "A::fun1() : " << i << " " << j << endl; } };class B : public A { public://隱藏void fun1(double i) { cout << "B::fun1() : " << i << endl;} };int main() {B b;b.fun1(5); //調用B類中的函數b.fun1(1, 2); //出錯,因為基類函數被隱藏return 0; }3.重寫:重寫翻譯自override,也翻譯成覆蓋(更好一點),是指派生類中存在重新定義的函數。其函數名,參數列表,返回值類型,所有都必須同基類中被重寫的函數一致。只有函數體不同(花括號內),派生類調用時會調用派生類的重寫函數,不會調用被重寫函數。重寫的基類中被重寫的函數必須有virtual修飾。
實例代碼如下:
#include<iostream> using namespace std; class A { public:virtual void fun3(int i) { cout << "A::fun3() : " << i << endl; }}; class B : public A { public://重寫virtual void fun3(double i) { cout << "B::fun3() : " << i << endl; } }; int main() {A a;B b;A* pa = &a;pa->fun3(3);pa = &b;pa->fun3(5);return 0; }重載和重寫的區別:
- 范圍區別:重寫和被重寫的函數在不同的類中,重載和被重載的函數在同一類中。
- 參數區別:重寫與被重寫的函數參數列表一定相同,重載和被重載的函數參數列表一定不同。
- virtual的區別:重寫的基類必須要有virtual修飾,重載函數和被重載函數可以被virtual修飾,也可以沒有。
隱藏和重寫,重載的區別:
- 與重載范圍不同:隱藏函數和被隱藏函數在不同類中。
- 參數的區別:隱藏函數和被隱藏函數參數列表可以相同,也可以不同,但函數名一定同;當參數不同時,無論基類中的函數是否被virtual修飾,基類函數都是被隱藏,而不是被重寫。
?
參考資料
1.?C++中重載、重寫(覆蓋)和隱藏的區別實例分析
總結
以上是生活随笔為你收集整理的C++中重载、重写(覆盖)和隐藏的区别实例分析的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 3. 二进制中1的个数
- 下一篇: 英雄联盟德玛西亚怎么出装
