C++三大特性:封裝、繼承、多態,今天給大家好好說說繼承的奧妙
1、虛函數:
C++的虛函數主要作用是“運行時多態”,父類中提供虛函數的實現,為子類提供默認的函數實現。子類可以重寫父類的虛函數實現子類的特殊化。
2、純虛函數:
C++中包含純虛函數的類,被稱為是“抽象類”。抽象類不能使用new出對象,只有實現了這個純虛函數的子類才能new出對象。
C++中的純虛函數更像是“只提供申明,沒有實現”,是對子類的約束,是“接口繼承”。
C++中的純虛函數也是一種“運行時多態”。
3、普通函數:
普通函數是靜態編譯的,沒有運行時多態,只會根據指針或引用的“字面值”類對象,調用自己的普通函數。
普通函數是父類為子類提供的“強制實現”。
因此,在繼承關系中,子類不應該重寫父類的普通函數,因為函數的調用至於類對象的字面值有關。
4、看具體運用實例:
1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 virtual void out1()=0; ///由子類實現 8 virtual ~A(){}; 9 virtual void out2() ///默認實現 10 { 11 cout<<"A(out2)"<<endl; 12 } 13 void out3() ///強制實現 14 { 15 cout<<"A(out3)"<<endl; 16 } 17 }; 18 19 class B:public A 20 { 21 public: 22 virtual ~B(){}; 23 void out1() 24 { 25 cout<<"B(out1)"<<endl; 26 } 27 void out2() 28 { 29 cout<<"B(out2)"<<endl; 30 } 31 void out3() 32 { 33 cout<<"B(out3)"<<endl; 34 } 35 }; 36 37 int main() 38 { 39 A *ab=new B; 40 ab->out1(); 41 ab->out2(); 42 ab->out3(); 43 cout<<"************************"<<endl; 44 B *bb=new B; 45 bb->out1(); 46 bb->out2(); 47 bb->out3(); 48 49 delete ab; 50 delete bb; 51 return 0; 52 }
5、總結:
因為繼承最主要的場景就是有多個類用的接口基本上一樣,那么就需要一個抽象類,如果這個抽象類全是純虛函數,
那么子類需要全部繼承並且定義,這樣帶來的問題就是可能有的類不需要這個接口但是還必須寫上且空定義,這樣很累,
那就需要一部分虛函數接口,所以根據實際情況,組合純虛函數和虛函數來使用。