1. 程式人生 > >C++中的多態

C++中的多態

space color class 如何 log 條件 類的屬性 c中 ren

所謂多態是指:父類和子類具有同名函數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 return
0; 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++中的多態