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


閱讀排行
本欄相關
- 04-02c語言函數(shù)調用后清空內存 c語言調用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調用函數(shù)求fibo C語言調用函數(shù)求
隨機閱讀
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實例總結
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載