一、多態的主要特點
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 }

