一、多態的主要特點
1、繼承體系下。繼承:是面向對象最顯著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數據屬性 和行為,並能擴展新的能力,已有類被稱為父類/基類,新增加的類被稱作子類/派生類。
2、子類對父類的虛函數進行重寫。
3、虛表。
在面向對象語言中,接口的多種不同現方式即為多態。同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果,這就是多態性。簡單說就是允許基類的指針指向子類的對象。
二、代碼實現
1、C++中的繼承與多態
1 class Base 2 { 3 public: 4 virtual void fun() {} //基類函數聲明為虛函數 5 int B1; 6 }; 7 class Derived :public Base //Derived類公有繼承Base類 8 { 9 public: 10 virtual void fun() { //函數重寫,此時基類函數可以聲明為虛函數,也可以不聲明 11 cout << "D1.fun" << endl; 12 } 13 int D1; 14 }; 15 int main(){ 16 Base b1; //創建父類對象 17 Derived d1;//創建子類對象 18 19 Base *p1 = (Base *)&d1;//定義一個父類指針,並通過父類指針訪問子類成員 20 p1->fun(); 21 22 Derived *p2 = dynamic_cast<Derived*> (&b1); //dynamic_cast用於將一個父類對象的指針轉換為子類對象的指針或引 用( 動態轉換) 23 p2->fun(); 24 25 getchar(); 26 return 0; 27 }
2. C語言實現C++的繼承與多態
1 typedef void(*FUNC)(); //定義一個函數指針來實現對成員函數的繼承 2 struct _Base //父類 3 { 4 FUNC _fun;//由於C語言中結構體不能包含函數,故借用函數指針在外面實現 5 int _B1; 6 }; 7 struct _Derived//子類 8 { 9 _Base _b1;//在子類中定義一個基類的對象即可實現對父類的繼承 10 int _D1; 11 }; 12 void fb_() //父類的同名函數 13 { 14 printf("_b1:_fun()\n"); 15 } 16 void fd_() //子類的同名函數 17 { 18 printf("_d1:_fun()\n"); 19 } 20 int main() { 21 _Base _b1;//定義一個父類對象_b1 22 _Derived _d1;定義一個子類對象_d1 23 24 _b1._fun = fb_;//父類的對象調用父類的同名函數 25 _d1._b1._fun = fd_;//子類的對象調用子類的同名函數 26 27 _Base *_p1 = &_b1;//定義一個父類指針指向父類的對象 28 _p1-> _fun(); //調用父類的同名函數 29 30 _p1 = (_Base *)&_d1;//讓父類指針指向子類的對象,由於類型不匹配所以要進行強轉 31 _p1->_fun(); //調用子類的同名函數 32 33 getchar(); 34 return 0; 35 }