重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這個問題主要考察的是C和C++的區別,以及C++中繼承和多態的概念。
C和C++的區別
C語言是面向過程的語言,而C++是面向對象的過程。
什么是面向對象和面向過程?
面向過程就是分析解決問題的步驟,然后用函數把這些步驟一步一步的進行實現,在使用的時候進行一一調用就行了,注重的是對于過程的分析。面向對象則是把構成問題的事進行分成各個對象,建立對象的目的也不僅僅是完成這一個個步驟,而是描述各個問題在解決的過程中所發生的行為。
面向對象和面向過程的區別?
面向過程的設計方法采用函數來描述數據的操作,但將函數與操作的數據進行分離開來。
面向對象的設計方法是將對象和數據進行封裝起來成為一個整體。
面向過程以設計步驟為過程,后期難以維護。
面向對象設計以數據為中心,數據相對與功能來說具有較強的穩定性更加易于維護。
面向對象的三大特征
封裝:
對于封裝來說就是數據與具體操作實現的代碼都放在某個對象的內部,使這些代碼的具體細節不被外界發現,只留下一些接口供外部來使用,而不能一任何的形式來對象內部的實現。使用封裝能夠隱藏具體的實現的細節,使代碼更加易于維護并且保證了系統的安全性。
繼承:
繼承機制是面向對象程序設計使代碼進行復用的最重要的手段,他允許程序員在保證類原有類特性的基礎上進行擴展來增加功能。這樣新產生的類就被稱為派生類,繼承就可以表現面向對象機制的的層次結構。
多態:
多態簡單點說就是“一個接口,多種實現”,就是同一種事物表現出的多種形態。多態在面向對象語言中是指:接口多種的不同實現方式。也就是復用相同接口,實現不同操作。
C++多態支持兩種多態性,編譯時多態和運行時多態。 編譯時多態是通過重載函數來實現的,運行時多態是通過虛函數來實現的。 靜態多態:編譯器在編譯期間完成,編譯器根據函數實參的類型(可能會隱式類型轉換),可推斷出要調用哪個函數,如果有對應的函數就調用相應的函數,否則就報一個編譯錯誤。動態多態:在函數執行期間(非編譯期)判斷所引用對象的實際類型,根據實際類型的調用相應的方法。使用virtual關鍵字修飾類的成員函數,指明該函數為虛函數,派生類需要重新實現,編譯器將實現動態綁定。
動態多態實現的條件: 1>、使用場景:父類的指針或者引用指向父類或者子類的對象(由賦值兼容規則決定); 2>、實現多態的兩個條件:虛函數的重寫;父類的指針或者引用調用重寫的虛函數。 3>、若父類中的成員函數加上virtual關鍵字,則子類中重寫的該函數默認virtual,可以不指定,但是一般加上; 重寫:子類重寫父類的虛函數,要求函數名稱,函數參數,返回值完全一樣(協變除外);
總的來說:封裝可以隱藏實現細節包括包含私有成員,使得代碼模塊增加安全指數;繼承可以擴展已存在的模塊,為了增加代碼的復用性;多態則是為了保證類在繼承和派生的時候,類的實例被正確調用,實現了接口的重用
C模擬實現多態
C++中的多態
我們知道的是在C++中會維護一張虛函數表,根據賦值兼容規則,我們知道父類的指針或者引用是可以指向子類對象的。如果一個父類的指針或者引用調用父類的虛函數則該父類的指針會在自己的虛函數表中查找自己的函數地址,如果該父類對象的指針或者引用指向的是子類的對象,而且該子類已經重寫了父類的虛函數,則該指針會調用子類的已經重寫的虛函數。
//c++中的多態
class A { public: virtual void fun()//虛函數實現 { cout << "Base A::fun() " << endl; } }; class B:public A { public: virtual void fun()//虛函數實現,子類中virtual關鍵字可以沒有 { cout << "Derived B::fun() " << endl; } }; void Test1() { A a;//基類對象 B b;//派生類對象 A* pa = &a;//父類指針指向父類對象 pa->fun();//調用父類的函數 pa = &b; //父類指針指向子類對象,多態實現 pa->fun();//調用派生類同名函數 }
另外有需要云服務器可以了解下創新互聯建站www.cdcxhl.com,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。