日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

使用C语言实现多态

發(fā)布時(shí)間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用C语言实现多态 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

一、C++的三大特性為:繼承,多態(tài),封裝

1.1 繼承

1.2 多態(tài)

1.3 封裝

二、用C語(yǔ)言實(shí)驗(yàn)多態(tài)

2.1 多態(tài)的主要特點(diǎn)

2.2 代碼實(shí)現(xiàn)

2.2.1 C++中的繼承與多態(tài)

2.2.2?C語(yǔ)言實(shí)現(xiàn)C++的繼承與多態(tài)


一、C++的三大特性為:繼承,多態(tài),封裝

1.1 繼承

一個(gè)對(duì)象直接使用另一個(gè)對(duì)象的屬性和方法。
優(yōu)點(diǎn):

  • 減少重復(fù)的代碼。
  • 繼承是多態(tài)的前提。
  • 繼承增加了類的耦合性。
  • ?? ?缺點(diǎn):

  • 繼承在編譯時(shí)刻就定義了,無(wú)法在運(yùn)行時(shí)刻改變父類繼承的實(shí)現(xiàn);
  • 父類通常至少定義了子類的部分行為,父類的改變都可能影響子類的行為;
  • 如果繼承下來(lái)的子類不適合解決新問(wèn)題,父類必須重寫(xiě)或替換,那么這種依賴關(guān)系就限制了靈活性,最終限制了復(fù)用性。
  • 虛繼承:為了解決多重繼承中的二義性問(wèn)題,它維護(hù)了一張?zhí)摶惐怼?/p>

    1.2 多態(tài)

    C++中有兩種多態(tài),稱為動(dòng)多態(tài)(運(yùn)行期多態(tài)) 和 靜多態(tài)(編譯期多態(tài)) ,而靜多態(tài)主要通過(guò)模板來(lái)實(shí)現(xiàn),宏也是實(shí)現(xiàn)靜多態(tài)的一種途徑 。 動(dòng)多態(tài)在C++中是通過(guò)虛函數(shù)實(shí)現(xiàn)的 ,即在基類中存在一些接口(一般為純虛函數(shù)),子類必須重載這些接口。這樣通過(guò)使用基類的指針或者引用指向子類的對(duì)象,就可以實(shí)現(xiàn)調(diào)用子類對(duì)應(yīng)的函數(shù)的功能。動(dòng)多態(tài)的函數(shù)調(diào)用機(jī)制是執(zhí)行期才能進(jìn)行確定,所以它是動(dòng)態(tài)的。
    接口的多種不同實(shí)現(xiàn)方式即為多態(tài)。可以舉個(gè)例子加深記憶,比如電腦的USB接口,既可以插優(yōu)盤(pán),又可以插鼠標(biāo),USB接口就類似類的接口。
    優(yōu)點(diǎn):

  • ?大大提高了代碼的可復(fù)用性;
  • 提高了了代碼的可維護(hù)性,可擴(kuò)充性;
  • 缺點(diǎn):?

  • 易讀性比較不好,調(diào)試比較困難
  • 模板只能定義在.h文件中,當(dāng)工程大了之后,編譯時(shí)間十分的變態(tài)
  • 1.3 封裝

    隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅僅對(duì)外提供接口和方法。
    優(yōu)點(diǎn): 1)隔離變化;2)便于使用; 3)提高重用性; 4)提高安全性
    缺點(diǎn): 1)如果封裝太多,影響效率; 2)使用者不能知道代碼具體實(shí)現(xiàn)。

    重載(overload)和覆蓋(override):
    重載: 寫(xiě)一個(gè)與已有函數(shù)同名但是參數(shù)表不同的函數(shù);
    覆蓋:虛函數(shù)總是在派生類中被改寫(xiě)。

    二、用C語(yǔ)言實(shí)驗(yàn)多態(tài)

    2.1 多態(tài)的主要特點(diǎn)

    1、繼承體系下。繼承:是面向?qū)ο笞铒@著的一個(gè)特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性 和行為,并能擴(kuò)展新的能力,已有類被稱為父類/基類,新增加的類被稱作子類/派生類。?
    2、子類對(duì)父類的虛函數(shù)進(jìn)行重寫(xiě)。
    3、虛表。
    在面向?qū)ο笳Z(yǔ)言中,接口的多種不同現(xiàn)方式即為多態(tài)。同一操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果,這就是多態(tài)性。簡(jiǎn)單說(shuō)就是允許基類的指針指向子類的對(duì)象。?

    2.2 代碼實(shí)現(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ù)重寫(xiě),此時(shí)基類函數(shù)可以聲明為虛函數(shù),也可以不聲明cout << "D1.fun" << endl;}int D1; }; int main(){Base b1; //創(chuàng)建父類對(duì)象Derived d1;//創(chuàng)建子類對(duì)象Base *p1 = (Base *)&d1;//定義一個(gè)父類指針,并通過(guò)父類指針訪問(wèn)子類成員p1->fun();Derived *p2 = dynamic_cast<Derived*> (&b1); //dynamic_cast用于將一個(gè)父類對(duì)象的指針轉(zhuǎn)換為子類對(duì)象的指針或引 用( 動(dòng)態(tài)轉(zhuǎn)換)p2->fun();getchar();return 0; }

    2.2.2?C語(yǔ)言實(shí)現(xiàn)C++的繼承與多態(tài)

    typedef void(*FUNC)(); //定義一個(gè)函數(shù)指針來(lái)實(shí)現(xiàn)對(duì)成員函數(shù)的繼承 struct _Base //父類 {FUNC _fun;//由于C語(yǔ)言中結(jié)構(gòu)體不能包含函數(shù),故借用函數(shù)指針在外面實(shí)現(xiàn)int _B1; }; struct _Derived//子類 {_Base _b1;//在子類中定義一個(gè)基類的對(duì)象即可實(shí)現(xiàn)對(duì)父類的繼承int _D1; }; void fb_() //父類的同名函數(shù) {printf("_b1:_fun()\n"); } void fd_() //子類的同名函數(shù) {printf("_d1:_fun()\n"); } int main() {_Base _b1;//定義一個(gè)父類對(duì)象_b1_Derived _d1;定義一個(gè)子類對(duì)象_d1_b1._fun = fb_;//父類的對(duì)象調(diào)用父類的同名函數(shù)_d1._b1._fun = fd_;//子類的對(duì)象調(diào)用子類的同名函數(shù)_Base *_p1 = &_b1;//定義一個(gè)父類指針指向父類的對(duì)象_p1-> _fun(); //調(diào)用父類的同名函數(shù)_p1 = (_Base *)&_d1;//讓父類指針指向子類的對(duì)象,由于類型不匹配所以要進(jìn)行強(qiáng)轉(zhuǎn)_p1->_fun(); //調(diào)用子類的同名函數(shù)getchar();return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的使用C语言实现多态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。