C 語言實現多型的原理 函式指標

2022-09-19 01:24:10 字數 2404 閱讀 5256

既然如此,在執行時決定跳到哪個地方去執行特定的**就可以。

以音訊解碼器作為樣例:aac 解碼器,mpeg解碼器。以及其它型別的解碼器。

那手動的多型可能會這樣實現:

u32 audiohandle = audiodecopen(int type)

這種**不利於擴充套件,沒增加乙個新的例項。就得修改audiodecopen這個函式。並且封裝的不好。

首先定義三種公有函式的函式指標。

typedef int (*openfunc) (void *this);

typedef int (*closefunc) (void *this);

typedef int (*controlfunc) (void *this, int command, void *param);

定義公共介面結構體 & audiodecoder 物件:

struct module

;struct audiodecoder;

提供乙個表驅動來方便找到相應的入口:

struct audiopoolpool = ,,};

int audiocreate(int type , handle *handle)

}*handle = (handle)dec;

}

這樣,當外界去create乙個audio的物件時,就已經初始化好相應的函式入口了。open就非常easy了:

int audioopen(struct audiodecoder *dec)

當中audiodecoder中的private 則是在各自的open中自己申請,自己釋放,close,control 相似。

今後維護這個表驅動就可以(pool),新的物件的支援增加進來就可以了,非常方便維護。

如今的pool依舊拓展性不太好,畢竟每次增加新的物件都得修改pool這個表驅動。

這裡提供乙個更好的方法:

struct audiopoolpool[max_pool];
在提供乙個pool_register(int type , struct module* module); 的功能:

int pool_register(int type , struct module* module); 

}if(k == null)

return no_error;

}

這樣在每乙個例項中呼叫 rigister 就能夠非常優雅的解決問題。

附上兩個解碼器的物件的**,mpeg的解碼器使用的是 libmad , aac的解碼器使用的是 libfaad 庫:

aac**片段:

...

static int close(void *this)

aacfaadprivate *private = (aacfaadprivate *)ad->privatedata;

private->exit = true;

if(private->decoderpid > 0)

if(private->hdecoder)

free(private);

ad->privatedata = null;

return ct_error_no_error;

}int aac_init()

mpeg**片段:

...

int close(void *this)

mpegmadprivate *private = (mpegmadprivate *)ad->privatedata;

private->exit = true;

if(private->decoderpid > 0)

mad_decoder_finish(&private->decoder);

if(private->data.buffer)

free(private);

ad->privatedata = null;

return ct_error_no_error;

}int control(void *this , u32 cmd ,void* param)

int mpeg_init()

使用物件導向來設計自己的**。維護上能夠降低非常多工作量。

在c語言裡面還實現了mvc模式等,這部分也是函式指標實現的。實際上僅僅是乙個**。

可是**維護,模組劃分上,非常清晰。

C語言實現多型

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

C語言實現多型

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

C 語言實現 C 多型

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