相信看到這個標題頭就暈了,其實將他們彼此放到一塊兒來看,就會比較清晰辨認了。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