C++中的多態
所謂多態是指:父類和子類具有同名函數fun(),當使用父類指針p指向父類對象時,調用p->fun()函數時,執行的是父類的fun()函數;當使用父類指針p指向子類對象時(類型兼容性原則允許這麽做),調用p->fun()函數時,執行的還是父類的fun()函數。原因在於子類從父類那裏繼承了一個fun()函數,自己又定義了一個fun()函數,則實際上子類中有兩個同名的fun()函數。而用父類指針指向子類對象,實際上指向的是子類對象中繼承自父類的fun()函數。那麽雖然父類指針p指向子類對象,調用p->fun()函數時,執行的實際上是繼承自父類的fun()函數。 我們實際想要的功能是:當父類和子類中具有同名函數fun()時,如果父類指針指向父類對象,則執行父類的fun()函數;如果父類指針指向子類對象,則執行子類的fun()函數,這個功能就叫做多態。為了實現這個多態功能,我們需要在父類的fun()函數前面添加一個關鍵字virtual,子類中的fun()函數前面可以不加virtual關鍵字聲明,但一般我們為了醒目,讓閱讀程序的人知道這裏可以實現多態功能,子類的fun()函數前面也是加virtual關鍵字的,
以下代碼是實現多態的實例:
1 #include<iostream> 2 using namespace std; 3 4 class Parent 5 { 6 public: 7 Parent(int _a):a(_a){} 8 void print(){cout<<"打印Parent類 a:"<<a<<endl;} 9 10 public: 11 int a; 12 }; 13 14 15 class Child:public Parent 16 { 17 public: 18 Child(int_a,int _a_,int _b):Parent(_a),a(_a_),b(_b){} 19 void print(){cout<<"打印Child類 b:"<<b<<endl;} 20 21 public: 22 int a; 23 int b; 24 }; 25 26 27 int main() 28 { 29 Child c(20,30,40); 30 31 Parent *base; 32 33 base=&c; 34 base->print(); 35 36 return0; 37 }
第8行的print()函數前面沒有加virtual關鍵字,所以上面的代碼無法實現多態功能,代碼的執行結果為:打印Parent類 a:20 可以看出,執行的是Child類中繼承自Parent類的print()函數。
如果我們在第8行print(0函數的前面加上virtual關鍵字,則代碼的執行結果是:打印Child類 b:40 這就實現了多態的功能
註意:基類的指針,無論如何只能指向基類的屬性和方法,以及子類中和基類同名的方法(不包括子類中和基類同名的屬性,因為屬性沒法聲明成virtual的)。對於子類的屬性,以及子類中和基類函數不同名的函數,基類指針都是無法調用的。
C++中面向對象編程的三大概念:
封裝:突破了C中函數的概念,用類做函數參數的時候,可以同時使用對象的屬性和方法;
繼承:實現了代碼的復用,可以使用以前的人寫的代碼;
多態:搭建了一個框架,定義好函數調用的接口,則後來人只要按照此框架寫代碼,函數的調用方法就不會改變,現在寫的代碼用同一種方法可以調用後來人寫的代碼,相當於使用未來...
實現多態的3個條件(適用於所有面向對象編程):
1.要有繼承;
2.要有虛函數重寫;
3.用父類指針(或父類引用)指向子類對象
C++中的多態