C語言模式實現C 繼承和多型

2021-08-04 11:57:52 字數 2532 閱讀 4230

這個問題主要考察的是c和c++的區別,以及c++中繼承和多型的概念。

c和c++的區別

c語言是面向過程的語言,而c++是物件導向的過程。

什麼是物件導向和面向過程?

面向過程就是分析解決問題的步驟,然後用函式把這些步驟一步一步的進行實現,在使用的時候進行一一呼叫就行了,注重的是對於過程的分析。物件導向則是把構成問題的事進行分成各個物件,建立物件的目的也不僅僅是完成這乙個個步驟,而是描述各個問題在解決的過程中所發生的行為。

物件導向和面向過程的區別?

面向過程的設計方法採用函式來描述資料的操作,但將函式與操作的資料進行分離開來。

物件導向的設計方法是將物件和資料進行封裝起來成為乙個整體。

面向過程以設計步驟為過程,後期難以維護。

物件導向設計以資料為中心,資料相對與功能來說具有較強的穩定性更加易於維護。

物件導向的三大特徵

封裝:

對於封裝來說就是資料與具體操作實現的**都放在某個物件的內部,使這些**的具體細節不被外界發現,只留下一些介面供外部來使用,而不能一任何的形式來物件內部的實現。使用封裝能夠隱藏具體的實現的細節,使**更加易於維護並且保證了系統的安全性。

繼承:

繼承機制是物件導向程式設計使**進行復用的最重要的手段,他允許程式設計師在保證類原有類特性的基礎上進行擴充套件來增加功能。這樣新產生的類就被稱為派生類,繼承就可以表現物件導向機制的的層次結構。

多型:

多型簡單點說就是「乙個介面,多種實現」,就是同一種事物表現出的多種形態。多型在物件導向語言中是指:介面多種的不同實現方式。也就是復用相同介面,實現不同操作。

c++多型支援兩種多型性,編譯時多型和執行時多型。編譯時多型是通過過載函式來實現的,執行時多型是通過虛函式來實現的。靜態多型:編譯器在編譯期間完成,編譯器根據函式實參的型別(可能會隱式型別轉換),可推斷出要呼叫哪個函式,如果有對應的函式就呼叫相應的函式,否則就報乙個編譯錯誤。動態多型:在函式執行期間(非編譯期)判斷所引用物件的實際型別,根據實際型別的呼叫相應的方法。使用virtual關鍵字修飾類的成員函式,指明該函式為虛函式,派生類需要重新實現,編譯器將實現動態繫結。

動態多型實現的條件:

1>、使用場景:父類的指標或者引用指向父類或者子類的物件(由賦值相容規則決定);

2>、實現多型的兩個條件:虛函式的重寫;父類的指標或者引用呼叫重寫的虛函式。

3>、若父類中的成員函式加上virtual關鍵字,則子類中重寫的該函式預設virtual,可以不指定,但是一般加上;

重寫:子類重寫父類的虛函式,要求函式名稱,函式引數,返回值完全一樣(協變除外);

總的來說:封裝可以隱藏實現細節包括包含私有成員,使得**模組增加安全指數;繼承可以擴充套件已存在的模組,為了增加**的復用性;多型則是為了保證類在繼承和派生的時候,類的例項被正確呼叫,實現了介面的重用

c模擬實現多型

c++中的多型

我們知道的是在c++中會維護一張虛函式表,根據賦值相容規則,我們知道父類的指標或者引用是可以指向子類物件的。如果乙個父類的指標或者引用呼叫父類的虛函式則該父類的指標會在自己的虛函式表中查詢自己的函式位址,如果該父類物件的指標或者引用指向的是子類的物件,而且該子類已經重寫了父類的虛函式,則該指標會呼叫子類的已經重寫的虛函式。

//c++中的多型

c語言實現多型我們知道在c語言中是沒有class類這個概念的,但是有struct結構體,我們可以考慮使用struct來模擬;但是在c語言的結構體內部是沒有成員函式的,如果實現這個父結構體和子結構體共有的函式呢?我們可以考慮使用函式指標來模擬。但是這樣處理存在乙個缺陷就是:父子各自的函式指標之間指向的不是類似c++中維護的虛函式表而是一塊物理記憶體,如果模擬的函式過多的話就會不容易維護了。

//c實現動態,用到函式指標

typedef

void(*fun)();//重定義乙個函式指標型別

//父類

struct base

;//子類

C語言模式實現C 繼承和多型

c實現乙個struct a和struct b各包含乙個int成員a和b,要求達到b繼承了a的效果,也就是b裡面包含乙個a。並且能達到多型的效果,也就是乙個a p指向a調的是a的函式,指向b呼叫的是b的函式。1.繼承 1 c 的繼承 在c 中,可以用乙個類 子類 去繼承另乙個類 父類 子類可以得到父類...

C語言實現繼承和多型

一 面向過程程式設計與物件導向程式設計的區別 眾所周知,c語言是一種典型的面向過程程式語言,而c 確實在它的基礎上改進的一款物件導向程式設計語言,那麼,面向過程與物件導向到底有什麼樣的區別呢?從設計方法角度看 面向過程程式設計方法採用函式 或過程 來描述對資料的操作,但又將函式與其操作的資料分離開來...

C語言設計模式繼承和多型特性詳解

最近在學習linux核心的原始碼,linux核心大量使用了類似c 繼承和多型的方式,對裝置進行封裝和功能呼叫,設計模式相當精妙,這裡簡單講解下其大致思路。才疏學淺,第一次寫部落格,如有問題,大家多多指教。我的大致思路是動物作為乙個基類,包含所有動物都具有的功能 linux核心中就是各種ops 如ea...