C語言模擬實現C 中的繼承和多型

2021-08-03 12:04:34 字數 1812 閱讀 8393

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

我們都知道c語言是面向過程的一種語言,c++則是物件導向的一類語言,而且c++是在c語言基礎上進行改進的一類語言,所以c++有c所沒有的的三大特性,它們分別是:封裝,繼承和多型,那仫什仫是繼承和多型呢?

1、什仫是繼承?

繼承是一種復用手段,繼承是型別之間的關係建模,共享共有的東西,實現各自本質不同的東西。

2、什仫是多型?

多型的字面意思就是」多種形態」,在c++中多型分為靜態多型(過載)和動態多型。

靜態多型/過載:函式名相同,函式引數不同(引數的個數和引數的型別),返回值可同可不同。

動態多型實現的條件:

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

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

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

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

c++中實現多型

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

**實現如下:

//c++中的多型

class b

virtual

void print()

;class d:public b

virtual

void print()

;void func(b *ptr)

void testcpp()

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

下面是我畫的一張理解c語言中繼承的圖:

下面是實現的**:

//c語言模擬實現繼承和多型

typedef

void (*func)(); //使用函式指標來模擬實現

struct b //父類

;struct d //子類

;void b_func() //父類的成員函式

void d_func() //子類的成員函式

//父類的指標可以指向父類或者子類的物件

void func(b *ptr) //公有的介面

void testc()

在這裡就分享結束了~~~

C語言模擬實現C 的繼承與多型

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

C語言模擬實現C 的繼承與多型

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

如何 用C語言模擬實現c 的繼承和多型??

首先,得知道什麼是繼承?繼承就是 子類可以呼叫父類的成員變數和成員函式。那麼如何用c語言模擬實現呢?include include 繼承 typedef void ss 結構體中不存在成員函式,用函式指標來實現 首先,得知道什麼是多型?多型的條件 子類的虛函式重寫父類的虛函式 重寫 函式名 引數 返...