C語言實現多型

2021-07-22 01:57:04 字數 1608 閱讀 5614

c++ 中的多型是指「通過基類物件的指標或者基類物件的引用呼叫虛函式」,表現更多派生類的特性,但根據c++多型的實現,我們發現這種方法存在一定的空間和效率的折損。不可否認,多型輕鬆解決了很多任務程中遇到的問題,這與 pure c 的解決方法比起來,更為優雅。

在考慮移植性上,c 的光芒要蓋過 c++,但 c++ 的多型是可借鑑的,於是用 pure c 來模仿 c++ 中多型行為。

在 c 中沒有類的概念,但有 struct,而且 c 中的 struct 是不允許有函式的,只允許存在變數,那是不是函式變數就允許存在了?!所以,函式指標可以給我們一些提示。

假定有乙個結構體 struct animal 宣告如下:

struct animal

;

此時 animal 中的 move 只是乙個指標,並沒有賦值,也就是說它不能代表任何的行為,但我們可以在 main 函式中對其進行賦值,賦予相應的行為。

void animal_move()

再假定乙個結構體 struct rabbit,我們可以暫且把它看作(因為 c 中沒有繼承概念)struct animal 的派生類,宣告如下:

struct rabbit

;

同樣我們可以給 rabbit 的 move 預定義乙個行為:

void rabbit_move()

struct animal 和 struct rabbit 在內容上完全一致,而且變數對齊上也完全一致,可以通過將 struct rabbit 型別的指標強制轉換為 struct animal 型別的指標,即:

animal *panimal;

rabbit rabbit;

//...

panimal = (animal*)&rabbit;

這樣,我們就可以通過 struct animal 型別的指標或者引用來操縱 struct rabbit 型別的物件了。

int main(void)

rabbit move. 請按任意鍵繼續. . .

是不是有需要注意的問題?為什麼剛才特別提出「在內容上完全一致,而且變數對齊上也完全一致」?倘若把 struct animal 的宣告作稍微的改變:

struct animal

;

panimal->move();

可以被形象的轉化為:

( * (panimal+sizeof(age)) ) ();

struct rabbit 結構

呼叫void (*move )();

<------ rabbit.move();

非法位址

<------ panimal->move();

因此需要模擬多型,必須保持函式指標變數對齊

在一些 c 開源專案中經常用到這種設計,譬如 libevent。

C語言實現多型

多型性是物件導向程式設計的乙個重要特徵,利用多型性可以設計和實現乙個易於擴充套件的系統。顧名思義,多型的意思是多種形態,在c 程式設計中,多型指的是 具有不同功能的函式可以用同乙個函式名,這樣可以用乙個函式名呼叫不同內容的函式。c 的多型分兩種 靜態多型性和動態多型性。c 中的函式過載和運算子過載實...

C 語言實現 C 多型

c 中的多型是指 通過基類物件的指標或者基類物件的引用呼叫虛函式 表現更多派生類的特性,但根據 c 多型的實現,我們發現這種方法存在一定的空間和效率的折損。不可否認,多型輕鬆解決了很多任務程中遇到的問題,這與 pure c 的解決方法比起來,更為優雅。在考慮移植性上,c 的光芒要蓋過 c 但 c 的...

C語言實現繼承與多型

在前面部落格已經詳細講過c 中繼承與多型的概念,在這裡則只使用c語言的語法來實現繼承與多型。繼承 即派生類中擁有基類的成員變數和成員函式,所以c語言實現如下 include typedef void func void void funb typedef struct b b typedef str...