C語言中的多態


一、多態的主要特點

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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM