使用C语言实现多态
目錄
一、C++的三大特性為:繼承,多態(tài),封裝
1.1 繼承
1.2 多態(tài)
1.3 封裝
二、用C語言實驗多態(tài)
2.1 多態(tài)的主要特點
2.2 代碼實現(xiàn)
2.2.1 C++中的繼承與多態(tài)
2.2.2?C語言實現(xiàn)C++的繼承與多態(tài)
一、C++的三大特性為:繼承,多態(tài),封裝
1.1 繼承
一個對象直接使用另一個對象的屬性和方法。
優(yōu)點:
?? ?缺點:
虛繼承:為了解決多重繼承中的二義性問題,它維護了一張?zhí)摶惐怼?/p>
1.2 多態(tài)
C++中有兩種多態(tài),稱為動多態(tài)(運行期多態(tài)) 和 靜多態(tài)(編譯期多態(tài)) ,而靜多態(tài)主要通過模板來實現(xiàn),宏也是實現(xiàn)靜多態(tài)的一種途徑 。 動多態(tài)在C++中是通過虛函數(shù)實現(xiàn)的 ,即在基類中存在一些接口(一般為純虛函數(shù)),子類必須重載這些接口。這樣通過使用基類的指針或者引用指向子類的對象,就可以實現(xiàn)調(diào)用子類對應的函數(shù)的功能。動多態(tài)的函數(shù)調(diào)用機制是執(zhí)行期才能進行確定,所以它是動態(tài)的。
 接口的多種不同實現(xiàn)方式即為多態(tài)。可以舉個例子加深記憶,比如電腦的USB接口,既可以插優(yōu)盤,又可以插鼠標,USB接口就類似類的接口。
優(yōu)點:
缺點:?
1.3 封裝
隱藏對象的屬性和實現(xiàn)細節(jié),僅僅對外提供接口和方法。
優(yōu)點: 1)隔離變化;2)便于使用; 3)提高重用性; 4)提高安全性
缺點: 1)如果封裝太多,影響效率; 2)使用者不能知道代碼具體實現(xiàn)。
重載(overload)和覆蓋(override):
 重載: 寫一個與已有函數(shù)同名但是參數(shù)表不同的函數(shù);
 覆蓋:虛函數(shù)總是在派生類中被改寫。
二、用C語言實驗多態(tài)
2.1 多態(tài)的主要特點
1、繼承體系下。繼承:是面向?qū)ο笞铒@著的一個特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性 和行為,并能擴展新的能力,已有類被稱為父類/基類,新增加的類被稱作子類/派生類。?
 2、子類對父類的虛函數(shù)進行重寫。
 3、虛表。
 在面向?qū)ο笳Z言中,接口的多種不同現(xiàn)方式即為多態(tài)。同一操作作用于不同的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果,這就是多態(tài)性。簡單說就是允許基類的指針指向子類的對象。?
2.2 代碼實現(xiàn)
2.2.1 C++中的繼承與多態(tài)
class Base { public:virtual void fun() {} //基類函數(shù)聲明為虛函數(shù)int B1; }; class Derived :public Base //Derived類公有繼承Base類 { public:virtual void fun() { //函數(shù)重寫,此時基類函數(shù)可以聲明為虛函數(shù),也可以不聲明cout << "D1.fun" << endl;}int D1; }; int main(){Base b1; //創(chuàng)建父類對象Derived d1;//創(chuàng)建子類對象Base *p1 = (Base *)&d1;//定義一個父類指針,并通過父類指針訪問子類成員p1->fun();Derived *p2 = dynamic_cast<Derived*> (&b1); //dynamic_cast用于將一個父類對象的指針轉(zhuǎn)換為子類對象的指針或引 用( 動態(tài)轉(zhuǎn)換)p2->fun();getchar();return 0; }2.2.2?C語言實現(xiàn)C++的繼承與多態(tài)
typedef void(*FUNC)(); //定義一個函數(shù)指針來實現(xiàn)對成員函數(shù)的繼承 struct _Base //父類 {FUNC _fun;//由于C語言中結(jié)構(gòu)體不能包含函數(shù),故借用函數(shù)指針在外面實現(xiàn)int _B1; }; struct _Derived//子類 {_Base _b1;//在子類中定義一個基類的對象即可實現(xiàn)對父類的繼承int _D1; }; void fb_() //父類的同名函數(shù) {printf("_b1:_fun()\n"); } void fd_() //子類的同名函數(shù) {printf("_d1:_fun()\n"); } int main() {_Base _b1;//定義一個父類對象_b1_Derived _d1;定義一個子類對象_d1_b1._fun = fb_;//父類的對象調(diào)用父類的同名函數(shù)_d1._b1._fun = fd_;//子類的對象調(diào)用子類的同名函數(shù)_Base *_p1 = &_b1;//定義一個父類指針指向父類的對象_p1-> _fun(); //調(diào)用父類的同名函數(shù)_p1 = (_Base *)&_d1;//讓父類指針指向子類的對象,由于類型不匹配所以要進行強轉(zhuǎn)_p1->_fun(); //調(diào)用子類的同名函數(shù)getchar();return 0; }總結(jié)
 
                            
                        - 上一篇: 详解 TCP 和 UDP
- 下一篇: linux传几百G文件,为什么我不推荐另
