閱讀114 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C語言模式實現C++繼承和多態

C語言模式實現C++繼承和多態

描述:

C實現一個struct A和struct B各包含一個int成員a和b,要求達到B繼承了A的效果,也就是B裏麵包含一個A。並且能達

到多態的效果,也就是一個A*p指向A調的是A的函數,指向B調用的是B的函數。


C++中的繼承、多態

繼承是麵向對象複用的重要手段。通過繼承定義一個類,繼承是類型之間的關係建模,共享公有的東西,實現各自本質

不同的東西。 

繼承是一種複用手段,在繼承關係裏基類的成員類的成員派生類的成員,由此達到複用的目的。

 如果你想學習C/C++可以來這個群,首先是三三零,中間是八五九,最後是七六六,裏麵可以學習和交流,也有學習資料可以可以下載。

所謂多態,其實就是“多種形態”。

C++中虛函數的主要作用就是實現多態。簡單說父類的指針/引用調用重寫的虛函數,當父類指針/引用指向父類對象

時調用的是父類的虛函數,指向子類對象時調用的是子類的虛函數。


[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include <iostream>  
  2. #include <assert.h>  
  3. #include <Windows.h>  
  4. using namespace std;  
  5.   
  6. //C++中的多態  
  7. class AA  
  8. {  
  9. public:  
  10.     virtual void fun1()  
  11.     {  
  12.         cout << "AA::fun1()" << endl;  
  13.     }  
  14.     virtual void fun2()  
  15.     {  
  16.         cout << "AA::fun2()" << endl;  
  17.     }  
  18. private:  
  19.     int _aa;  
  20. };  
  21.   
  22.   
  23. class BB :public AA   //公有繼承  
  24. {  
  25. public:  
  26.     virtual void fun1()     //子類重寫父類的虛函數時,子類的virtual可以不寫  
  27.     {  
  28.         cout << "BB::fun1()" << endl;  
  29.     }  
  30.     virtual void fun2()  
  31.     {  
  32.         cout << "BB::fun2()" << endl;  
  33.     }  
  34. private:  
  35.     int _bb;  
  36. };  

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #include "源.h"  
  2.   
  3. void Test()  
  4. {  
  5.     AA tty;  
  6.     BB vvz;  
  7.     AA* p = &tty;   //父類指針指向父類引用  
  8.     p->fun1();      //父類指針指向父類對象  
  9.     p->fun2();  
  10.     p = &vvz;      //父類指針指向子類引用,多態體現  
  11.     p->fun1();     //父類指針指向子類對象  
  12.     p->fun2();  
  13. }  
  14.   
  15. int main()  
  16. {  
  17.     Test();  
  18.     system("pause");  
  19.     return 0;  
  20. }  




而用C語言又怎樣實現C++的繼承和多態呢?


C語言是一種麵向過程的程序設計語言,而C++是在C語言基礎上衍生來的麵向對象的語言,實際上,很多C++實現的底層是用C語言實現的。

C++在語言級別添加了很多新的機製(封裝、繼承、多態...)。而在C語言中,我們也可以使用這樣的機製,前提是我們需要自己實現。

基本思想:

1.結構體

在C語言中,我們常常把一個對象用結構體進行封裝,這樣便於對對象進行操作,例:

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. struct AA  
  2. {  
  3.     int a;  
  4.     char b;  
  5. }xxy;  
結構體可以嵌套,因而可以把一個結構體當成另一個結構體的成員,例:

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. struct AA  
  2. {  
  3.     int a;  
  4.     char b;  
  5. }xxy;  
  6.   
  7. struct BB  
  8. {  
  9.     int c;  
  10.     double q;  
  11.     struct AA tty;  
  12. }zzo;  

2.函數指針

顧名思義,函數指針就是指向函數的指針,它是一個指針,指向函數的首地址,函數名即為該函數的首地址。

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. //Fun函數為一個返回值為char* 的函數  
  2. char* Fun(char* p1, char* p2)  
  3. {  
  4.     int i = 0;  
  5.     i = strcmp(p1, p2);  
  6.     if (i == 0)  
  7.     {  
  8.         return p1;  
  9.     }  
  10.     else  
  11.     {  
  12.         return p2;  
  13.     }  
  14. }  
  15.   
  16. int main()  
  17. {  
  18.     char* (*tty)(char* p1, char* p2);   //tty為一個函數指針  
  19.     tty = &Fun;  
  20.     (*tty)("aa""bb");  
  21.     system("pause");  
  22.     return 0;  
  23. }  


C語言實現繼承、多態

在C語言中,可以利用“結構在內存中的布局與結構的聲明具有一致的順序”這一事實實現繼承。

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. //用一個函數指針  
  2. typedef void(*FUN)();            
  3.   
  4. //父類  
  5. struct AA  
  6. {  
  7.     FUN fun;  
  8. };  
  9.   
  10. //子類  
  11. struct BB  
  12. {  
  13.     AA a;  
  14. };  
  15.   
  16. void FunA()  
  17. {  
  18.     printf("AA::fun\n");  
  19. }  
  20.   
  21. void FunB()  
  22. {  
  23.     printf("BB::fun\n");  
  24. }  

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. void Test()  
  2. {  
  3.     AA a;  
  4.     BB b;  
  5.     a.fun = FunA;   //父類對象調用父類函數  
  6.     b.a.fun = FunB;   //子類對象調用子類函數  
  7.   
  8.     AA* p = &a;   //定義一個父類指針指向父類對象  
  9.     p->fun();    //調用父類的fun函數  
  10.     p = (AA*)&b;   //父類指針指向子類對象  
  11.     p->fun();    //調用子類的fun函數  
  12. }  
  13.   
  14. int main()  
  15. {  
  16.     Test();  
  17.     system("pause");  
  18.     return 0;  
  19. }  


最後更新:2017-08-13 22:41:10

  上一篇:go  為什麼網站seo優化要持續進行不能暫停?
  下一篇:go  東芝開發高速對照大數據技術 比傳統處理技術快50倍