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

2021-09-09 07:55:29 字數 1693 閱讀 6169

最近在學習linux核心的原始碼,linux核心大量使用了類似c++繼承和多型的方式,對裝置進行封裝和功能呼叫,設計模式相當精妙,這裡簡單講解下其大致思路。才疏學淺,第一次寫部落格,如有問題,大家多多指教。

我的大致思路是動物作為乙個基類,包含所有動物都具有的功能(linux核心中就是各種ops)如eat,walk,talk,其下有派生類dog(或其他動物),dog又具有自己的功能和具有動物類的功能,我們將dog繼承的animal的ops指向dog類我們自己定義的dog的ops,在呼叫dog繼承的animal的ops具體的函式指標,就會指向animal中dog特有的ops。

定義乙個animal基類,以及animal共有的ops

/* 動物類,是所有動物類的基類,也是抽象類 */

struct animal_s_

;/* 動物的基本行為 */

struct animal_ops_s_

;

派生出乙個dog類

struct dog_s_ 

;

我們自己定義的dog的ops,以及其具體的功能,如dog eat bone

//定義dog的ops,animal_eat等來自struct animal_ops_s_

struct animal_ops_s_ dog_ops =

;//dog類的ops具體的實現

static

void

dog_eat

(char *food)

static

void

dog_walk

(int steps)

static

void

dog_talk

(char *msg)

dog_init,最終呼叫dog繼承的animal的ops指向我們自己定義的dog特有的ops

//dog_init

struct dog_s_ *

dog_init()

main函式實現

int main

(int argc,

const char *ar**)

最終執行效果如下

當然linux核心中驅動的**並不簡單,這裡只是其一種封裝模式。實際上當dog的ops逐漸增多時,逐個呼叫便顯得不是那麼方便,或者當有多個animal的派生類被給出時,使用類似多型的方式進行再次封裝,就很簡潔了。

多型封裝函式animal_self

void

animal_self

(struct animal_s_ *animal, char *food, int steps, char *msg)

這樣只需要呼叫animal_self函式,將派生類賦給第乙個引數,對不同的animal派生類就可以實現類似多型的功能。

//animal派生類的多型呼叫

animal_self

(dog,

"bone",5

,"wuang wuang wuang..."

);

C語言和設計模式(繼承 封裝 多型)

記得還在我們大學c 第一門課的時候,老師就告訴我們說,c 是一門物件導向的語言。c 有三個最重要的特點,即繼承 封裝 多型。等到後來隨著編碼的增多和工作經驗的積累,我也慢慢明白了物件導向的含義。可是,等我工作以後,使用的程式語言更多的是c語言,這時候我又想能不能把c語言變成物件導向的語言呢?等到後來...

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

這個問題主要考察的是c和c 的區別,以及c 中繼承和多型的概念。c和c 的區別 c語言是面向過程的語言,而c 是物件導向的過程。什麼是物件導向和面向過程?面向過程就是分析解決問題的步驟,然後用函式把這些步驟一步一步的進行實現,在使用的時候進行一一呼叫就行了,注重的是對於過程的分析。物件導向則是把構成...

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

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