C++_重載、重寫和重定義的區別

相信看到這個標題頭就暈了,其實將他們彼此放到一塊兒來看,就會比較清晰辨認了。ios

重載:函數名相同,函數的參數個數、參數類型或參數順序三者中必須至少有一種不一樣。函數返回值的類型能夠相同,也能夠不相同。發生在一個類內部。函數

重定義:也叫作隱藏,子類從新定義父類中有相同名稱的非虛函數 ( 參數列表能夠不一樣 ) ,指派生類的函數屏蔽了與其同名的基類函數。發生在繼承中。spa

重寫:也叫作覆蓋,通常發生在子類和父類繼承關係之間。子類從新定義父類中有相同名稱和參數的虛函數。code


若是一個類,存在和父類相同的函數,那麼,這個類將會覆蓋其父類的方法,除非你在調用的時候,強制轉換爲父類類型,不然試圖對子類和父類作相似重載的調用是不能成功的。 blog

重寫須要注意:
一、 被重寫的函數不能是static的。必須是virtual的
2 、重寫函數必須有相同的類型,名稱和參數列表
3 、重寫函數的訪問修飾符能夠不一樣。儘管virtual是private的,派生類中重寫改寫爲public,protected也是能夠的繼承

重定義規則以下:
   a 、若是派生類的函數和基類的函數同名,可是參數不一樣,此時,無論有無virtual,基類的函數被隱藏。
   b 、若是派生類的函數與基類的函數同名,而且參數也相同,可是基類函數沒有vitual關鍵字,此時,基類的函數被隱藏(若是相同有Virtual就是重寫覆蓋了)。it

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 class Animal
 6 {
 7 public:
 8 void func1(int tmp)
 9 {
10 cout<<"I'm an animal -"<<tmp<<endl;
11 }
12 void func1(char *s)//函數的重載
13 {
14 cout<<s<<endl;
15 }
16 virtual void func2(int tmp)
17 {
18 cout<<"I'm virtual animal -"<<tmp<<endl;
19 }
20 void func3(int tmp)
21 {
22 cout<<"I'm an animal -"<<tmp<<endl;
23 }
24 };
25 
26 class Fish:public Animal
27 {
28 public:
29 void func1()//函數的重定義 會覆蓋父類
30 {
31 cout<<"I'm a fish"<<endl;
32 }
33 void func2(char *s)//函數的重寫
34 {
35 cout<<s<<endl;
36 }
37 };
38 
39 int main()
40 {
41 Fish fi;
42 Animal an;
43 
44 fi.func1();
45 fi.func2("I'm a fish,too");
46 fi.func3(3);
47 
48 an.func1(1);
49 an.func1("I'm an animal");
50 an.func2(1);
51 return 0;
52 }

 

運行結果以下:io

相關文章
相關標籤/搜索