C語言實現(xiàn)封裝、繼承和多態(tài)

C語言實現(xiàn)封裝退渗、繼承和多態(tài)

1.封裝

C語言中雖然沒有類移稳,但有struct和指針。我們可以在一個struct中存入數(shù)據(jù)和函數(shù)指針会油,以此來模擬類行為个粱。

typedef struct _Parent

{

? ? int a;

? ? int b;

? ? void (*print)(struct _Parent *This);

}Parent;

封裝性的意義在于,函數(shù)和數(shù)據(jù)是綁在一起的翻翩,數(shù)據(jù)和數(shù)據(jù)是綁在一起的都许。這樣,我們就可以通過簡單的一個結(jié)構(gòu)指針訪問到所有的數(shù)據(jù)嫂冻,遍歷所有的函數(shù)胶征。封裝性,這是類擁有的屬性桨仿,當(dāng)然也是數(shù)據(jù)結(jié)構(gòu)體擁有的屬性睛低。

2.繼承

如果要完全地用C語言實現(xiàn)繼承,可能有點難度服傍。但如果只是簡單的做一下钱雷,保證子類中含有父類中的所有成員。這還是不難的吹零。

typedef struct _Child

{?

? ? Parent parent;?

? ? int c;?

}Child;?

在設(shè)計C語言繼承性的時候罩抗,我們需要做的就是把基礎(chǔ)數(shù)據(jù)放在繼承的結(jié)構(gòu)的首位置即可。這樣灿椅,不管是數(shù)據(jù)的訪問套蒂、數(shù)據(jù)的強轉(zhuǎn)、數(shù)據(jù)的訪問都不會有什么問題茫蛹。

3.多態(tài)

這個特性恐怕是面向?qū)ο笏枷肜锩孀钣杏玫牧恕?/p>

要用C語言實現(xiàn)這個特性需要一點點技巧操刀,但也不是不可能的。

我們使用上面定義的兩個結(jié)構(gòu)體Parent, Child婴洼。簡單地描述了一個多態(tài)的例子骨坑。

#include <stdio.h>

#include <stdlib.h>

typedef struct _Parent

{?

? ? int a;?

? ? int b;?

? ? void (*print)(struct _Parent *This);?

}Parent;

typedef struct _Child

{?

? ? Parent parent;?

? ? int c;?

}Child;

void print_parent(Parent *This)?

{?

? ? printf("a = %d. b = %d.\n",? This->a, This->b);?

}?


void print_child(Parent *This)?

{?

? ? Child *p = (Child *)This;?

printf("a = %d. b = %d. c = %d.\n", p->parent.a, p->parent.b, p->c);?

}?


Parent *create_parent(int a, int b)?

{?

? ? Parent *This;?


? ? This = NULL;?

? ? This = (Parent *)malloc(sizeof(Parent));?

? ? if (This != NULL)

{?

? ? ? ? This->a = a;?

? ? ? ? This->b = b;?

? ? ? ? This->print = print_parent;?

? ? ? ? printf("Create parent successfully!\n");?

? ? }?


? ? return This;?

}?


void destroy_parent(Parent **p)?

{?

? ? if (*p != NULL)

{?

? ? ? ? free(*p);?

? ? ? ? *p = NULL;?

? ? ? ? printf("Delete parent successfully!\n");?

? ? }?

}?


Child *create_child(int a, int b, int c)?

{?

? ? Child *This;?


? ? This = NULL;?

? ? This = (Child *)malloc(sizeof(Child));?

? ? if (This != NULL)

{?

? ? ? ? This->parent.a = a;?

? ? ? ? This->parent.b = b;?

? ? ? ? This->c = c;?

? ? ? ? This->parent.print = print_child;?

? ? ? ? printf("Create child successfully!\n");?

? ? }?


? ? return This;?

}?


void destroy_child(Child **p)?

{?

? ? if (*p != NULL)

{?

? ? ? ? free(*p);?

? ? ? ? *p = NULL;?

? ? ? ? printf("Delete child successfully!\n");?

? ? }?

}?


int main()?

{?

? ? Child *p = create_child(1, 2, 3);?

? ? Parent *q;?


? ? q = (Parent *)p;?


? ? q->print(q);?


? ? destroy_child(&p);

system("pause");

? ? return 0;?


}?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市窃蹋,隨后出現(xiàn)的幾起案子卡啰,更是在濱河造成了極大的恐慌,老刑警劉巖警没,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匈辱,死亡現(xiàn)場離奇詭異,居然都是意外死亡杀迹,警方通過查閱死者的電腦和手機亡脸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浅碾,你說我怎么就攤上這事大州。” “怎么了垂谢?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵厦画,是天一觀的道長。 經(jīng)常有香客問我滥朱,道長根暑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任徙邻,我火速辦了婚禮排嫌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缰犁。我一直安慰自己淳地,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布帅容。 她就那樣靜靜地躺著颇象,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丰嘉。 梳的紋絲不亂的頭發(fā)上夯到,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天嚷缭,我揣著相機與錄音饮亏,去河邊找鬼。 笑死阅爽,一個胖子當(dāng)著我的面吹牛路幸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播付翁,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼简肴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了百侧?” 一聲冷哼從身側(cè)響起砰识,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佣渴,沒想到半個月后辫狼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡辛润,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年膨处,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡真椿,死狀恐怖鹃答,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情突硝,我是刑警寧澤测摔,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站解恰,受9級特大地震影響避咆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜修噪,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一查库、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦病游、人聲如沸呵曹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至撤师,卻和暖如春剂府,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剃盾。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工腺占, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痒谴。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓衰伯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親积蔚。 傳聞我的和親對象是個殘疾皇子意鲸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,500評論 2 348