C語(yǔ)言實(shí)現(xiàn)C++繼承和多態(tài)的代碼分享
這個(gè)問(wèn)題主要考察的是C和C++的區(qū)別,以及C++中繼承和多態(tài)的概念。
C和C++的區(qū)別
C語(yǔ)言是面向過(guò)程的語(yǔ)言,而C++是面向?qū)ο蟮倪^(guò)程。
什么是面向?qū)ο蠛兔嫦蜻^(guò)程?
面向過(guò)程就是分析解決問(wèn)題的步驟,然后用函數(shù)把這些步驟一步一步的進(jìn)行實(shí)現(xiàn),在使用的時(shí)候進(jìn)行一一調(diào)用就行了,注重的是對(duì)于過(guò)程的分析。面向?qū)ο髣t是把構(gòu)成問(wèn)題的事進(jìn)行分成各個(gè)對(duì)象,建立對(duì)象的目的也不僅僅是完成這一個(gè)個(gè)步驟,而是描述各個(gè)問(wèn)題在解決的過(guò)程中所發(fā)生的行為。
面向?qū)ο蠛兔嫦蜻^(guò)程的區(qū)別?
面向過(guò)程的設(shè)計(jì)方法采用函數(shù)來(lái)描述數(shù)據(jù)的操作,但將函數(shù)與操作的數(shù)據(jù)進(jìn)行分離開來(lái)。
面向?qū)ο蟮脑O(shè)計(jì)方法是將對(duì)象和數(shù)據(jù)進(jìn)行封裝起來(lái)成為一個(gè)整體。
面向過(guò)程以設(shè)計(jì)步驟為過(guò)程,后期難以維護(hù)。
面向?qū)ο笤O(shè)計(jì)以數(shù)據(jù)為中心,數(shù)據(jù)相對(duì)與功能來(lái)說(shuō)具有較強(qiáng)的穩(wěn)定性更加易于維護(hù)。
面向?qū)ο蟮娜筇卣?
封裝:
對(duì)于封裝來(lái)說(shuō)就是數(shù)據(jù)與具體操作實(shí)現(xiàn)的代碼都放在某個(gè)對(duì)象的內(nèi)部,使這些代碼的具體細(xì)節(jié)不被外界發(fā)現(xiàn),只留下一些接口供外部來(lái)使用,而不能一任何的形式來(lái)對(duì)象內(nèi)部的實(shí)現(xiàn)。使用封裝能夠隱藏具體的實(shí)現(xiàn)的細(xì)節(jié),使代碼更加易于維護(hù)并且保證了系統(tǒng)的安全性。
繼承:
繼承機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼進(jìn)行復(fù)用的最重要的手段,他允許程序員在保證類原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展來(lái)增加功能。這樣新產(chǎn)生的類就被稱為派生類,繼承就可以表現(xiàn)面向?qū)ο髾C(jī)制的的層次結(jié)構(gòu)。
多態(tài):
多態(tài)簡(jiǎn)單點(diǎn)說(shuō)就是“一個(gè)接口,多種實(shí)現(xiàn)”,就是同一種事物表現(xiàn)出的多種形態(tài)。多態(tài)在面向?qū)ο笳Z(yǔ)言中是指:接口多種的不同實(shí)現(xiàn)方式。也就是復(fù)用相同接口,實(shí)現(xiàn)不同操作。
C++多態(tài)支持兩種多態(tài)性,編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。 編譯時(shí)多態(tài)是通過(guò)重載函數(shù)來(lái)實(shí)現(xiàn)的,運(yùn)行時(shí)多態(tài)是通過(guò)虛函數(shù)來(lái)實(shí)現(xiàn)的。 靜態(tài)多態(tài):編譯器在編譯期間完成,編譯器根據(jù)函數(shù)實(shí)參的類型(可能會(huì)隱式類型轉(zhuǎn)換),可推斷出要調(diào)用哪個(gè)函數(shù),如果有對(duì)應(yīng)的函數(shù)就調(diào)用相應(yīng)的函數(shù),否則就報(bào)一個(gè)編譯錯(cuò)誤。動(dòng)態(tài)多態(tài):在函數(shù)執(zhí)行期間(非編譯期)判斷所引用對(duì)象的實(shí)際類型,根據(jù)實(shí)際類型的調(diào)用相應(yīng)的方法。使用virtual關(guān)鍵字修飾類的成員函數(shù),指明該函數(shù)為虛函數(shù),派生類需要重新實(shí)現(xiàn),編譯器將實(shí)現(xiàn)動(dòng)態(tài)綁定。
動(dòng)態(tài)多態(tài)實(shí)現(xiàn)的條件: 1>、使用場(chǎng)景:父類的指針或者引用指向父類或者子類的對(duì)象(由賦值兼容規(guī)則決定); 2>、實(shí)現(xiàn)多態(tài)的兩個(gè)條件:虛函數(shù)的重寫;父類的指針或者引用調(diào)用重寫的虛函數(shù)。 3>、若父類中的成員函數(shù)加上virtual關(guān)鍵字,則子類中重寫的該函數(shù)默認(rèn)virtual,可以不指定,但是一般加上; 重寫:子類重寫父類的虛函數(shù),要求函數(shù)名稱,函數(shù)參數(shù),返回值完全一樣(協(xié)變除外);
總的來(lái)說(shuō):封裝可以隱藏實(shí)現(xiàn)細(xì)節(jié)包括包含私有成員,使得代碼模塊增加安全指數(shù);繼承可以擴(kuò)展已存在的模塊,為了增加代碼的復(fù)用性;多態(tài)則是為了保證類在繼承和派生的時(shí)候,類的實(shí)例被正確調(diào)用,實(shí)現(xiàn)了接口的重用
C模擬實(shí)現(xiàn)多態(tài)
C++中的多態(tài)
我們知道的是在C++中會(huì)維護(hù)一張?zhí)摵瘮?shù)表,根據(jù)賦值兼容規(guī)則,我們知道父類的指針或者引用是可以指向子類對(duì)象的。如果一個(gè)父類的指針或者引用調(diào)用父類的虛函數(shù)則該父類的指針會(huì)在自己的虛函數(shù)表中查找自己的函數(shù)地址,如果該父類對(duì)象的指針或者引用指向的是子類的對(duì)象,而且該子類已經(jīng)重寫了父類的虛函數(shù),則該指針會(huì)調(diào)用子類的已經(jīng)重寫的虛函數(shù)。
//c++中的多態(tài)
class A
{
public:
virtual void fun()//虛函數(shù)實(shí)現(xiàn)
{
cout << "Base A::fun() " << endl;
}
};
class B:public A
{
public:
virtual void fun()//虛函數(shù)實(shí)現(xiàn),子類中virtual關(guān)鍵字可以沒(méi)有
{
cout << "Derived B::fun() " << endl;
}
};
void Test1()
{
A a;//基類對(duì)象
B b;//派生類對(duì)象
A* pa = &a;//父類指針指向父類對(duì)象
pa->fun();//調(diào)用父類的函數(shù)
pa = &b; //父類指針指向子類對(duì)象,多態(tài)實(shí)現(xiàn)
pa->fun();//調(diào)用派生類同名函數(shù)
}
C語(yǔ)言實(shí)現(xiàn)多態(tài)
我們知道在C語(yǔ)言中是沒(méi)有class類這個(gè)概念的,但是有struct結(jié)構(gòu)體,我們可以考慮使用struct來(lái)模擬;但是在C語(yǔ)言的結(jié)構(gòu)體內(nèi)部是沒(méi)有成員函數(shù)的,如果實(shí)現(xiàn)這個(gè)父結(jié)構(gòu)體和子結(jié)構(gòu)體共有的函數(shù)呢?我們可以考慮使用函數(shù)指針來(lái)模擬。但是這樣處理存在一個(gè)缺陷就是:父子各自的函數(shù)指針之間指向的不是類似C++中維護(hù)的虛函數(shù)表而是一塊物理內(nèi)存,如果模擬的函數(shù)過(guò)多的話就會(huì)不容易維護(hù)了。
//C實(shí)現(xiàn)動(dòng)態(tài),用到函數(shù)指針
typedef void(*FUN)();//重定義一個(gè)函數(shù)指針類型
//父類
struct Base
{
FUN _f;
};
//子類
struct Derived
{
Base _b;//在子類中定義一個(gè)基類的對(duì)象即可實(shí)現(xiàn)對(duì)父類的繼承
};
void FunB()
{
printf("%s\n", "Base::fun()");
}
void FunD()
{
printf("%s\n", "Derived::fun()");
}
void Test2()
{
Base b;//父類對(duì)象
Derived d;//子類對(duì)象
b._f = FunB;//父類對(duì)象調(diào)用父類同名函數(shù)
d._b._f = FunD;//子類調(diào)用子類的同名函數(shù)
Base *pb = &b;//父類指針指向父類對(duì)象
pb->_f();
pb = (Base *)&d;//讓父類指針指向子類的對(duì)象,由于類型不匹配所以要進(jìn)行強(qiáng)轉(zhuǎn)
pb->_f();
}
欄 目:C語(yǔ)言
下一篇:C++ 數(shù)據(jù)結(jié)構(gòu)二叉樹(前序/中序/后序遞歸、非遞歸遍歷)
本文標(biāo)題:C語(yǔ)言實(shí)現(xiàn)C++繼承和多態(tài)的代碼分享
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1308.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?


