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...