999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

用C語言實現(xiàn)繼承的研究

2017-01-09 06:19:02
關(guān)鍵詞:方法

楊 韜

(廣州致遠電子股份有限公司,廣東 廣州 510660)

用C語言實現(xiàn)繼承的研究

楊 韜

(廣州致遠電子股份有限公司,廣東 廣州 510660)

C語言在嵌入式軟件開發(fā)中被廣泛使用,但由于開發(fā)人員和應用場景等原因,面向?qū)ο蟆⒃O計模式等優(yōu)秀的軟件開發(fā)方法始終沒有很好地運用起來。時至今日,物聯(lián)網(wǎng)等應用的興起給嵌入式軟件開發(fā)帶來新的挑戰(zhàn),而傳統(tǒng)的面向過程開發(fā)方法已經(jīng)難以支撐這些復雜的應用。因此,有必要在嵌入式軟件開發(fā)中引入面向?qū)ο蟆⒃O計模式等優(yōu)秀的軟件開發(fā)方法。面向?qū)ο笫乾F(xiàn)在軟件方法的根基,繼承是面向?qū)ο蟮娜筇匦灾唬疚慕Y(jié)合C語言的特性,對使用C語言實現(xiàn)繼承進行了討論。

C語言;面向?qū)ο螅活悾焕^承

0 引言

物聯(lián)網(wǎng)等應用的興起,給嵌入式軟件開發(fā)帶來新的挑戰(zhàn),而傳統(tǒng)的面向過程開發(fā)方法已經(jīng)難以支撐這些復雜的應用。因此,有必要在嵌入式軟件開發(fā)中引入面向?qū)ο蟆⒃O計模式等優(yōu)秀的軟件開發(fā)方法。在C++等面向?qū)ο笳Z言中對類做了原生的支持,提供了class這一數(shù)據(jù)類型,能夠很自然地支持繼承這一面向?qū)ο筇匦浴1M管C語言并不支持class,但是能夠通過一些特殊的處理來模擬繼承,本文將討論如何使用C語言來實現(xiàn)繼承這一面向?qū)ο筇匦浴?/p>

1 基本概念[1]

1.1 類

面向?qū)ο笥腥筇匦裕悍庋b、繼承、多態(tài),這些特性主要通過類來體現(xiàn)。類就是一個封裝了屬性以及相關(guān)操作的代碼的邏輯實體。

類具有屬性,它是對象狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。

類具有方法,它是對象行為的抽象,用方法名和實現(xiàn)該操作的方法來描述。

除了封裝屬性和操作外,類還具有訪問控制的能力,比如,某些屬性和方法可以是私有的,不能被外界訪問。通過訪問控制,能夠?qū)?nèi)部數(shù)據(jù)提供不同級別的保護,以防止外界意外地改變或使用了私有部分。不同的編程語言提供的訪問控制等級不盡相同,但都有公有、私有兩個等級。

類是抽象的數(shù)據(jù)類型,在內(nèi)存中并不存在(Python等動態(tài)語言除外),只有類的實例存在于內(nèi)存中。

1.2 繼承

在定義一個類的時候,可以在一個已經(jīng)存在的類的基礎上進行,新的類自動繼承已存在類的公有屬性和方法,在此基礎上可以添加新的屬性或方法,這種特性就是繼承。被繼承的類稱作父類或基類,繼承而得到的新類稱作子類或派生類。通過繼承可以使開發(fā)的軟件具有擴展性,簡化了類的創(chuàng)建工作量,提高了代碼復用性。

圖1 繼承

圖1為類繼承的UML圖,圖中定義了兩個類,兩個類用空心三角箭頭連接,箭頭指向的就是父類Human,箭尾就是子類Chinese。Chinese類繼承了Human類,Chinese類自動擁有Human的公有屬性和方法(即name、buy()和talk()),此外,Chinese類新添加了方法play_mahjong()。通俗點描述就是:中國人是人類,有名字,能夠講話和購物,除此之外,還能打麻將。

繼承分為單重繼承和多重繼承:子類只繼承一個父類,稱為單重繼承,如圖1所示;子類繼承多個父類,稱為多重繼承,如圖2所示。為了避免二義性,不推薦使用多重繼承,本文只討論單重繼承。

圖2 多重繼承

2 類的C語言實現(xiàn)

在C語言中可以使用.c、.h和結(jié)構(gòu)體來實現(xiàn)類,以圖1中Human類為例,可以使用human.h、human.c、struct human三個元素來完成封裝,human.c為human.h中函數(shù)聲明的實現(xiàn),本文不討論這些細節(jié),只給出human.h的關(guān)鍵代碼片段:

程序清單1 Human類C語言實現(xiàn)

// human.h

typedef struct human {

const char *name;

int _money;

} human_t;

human_t *human_init (human_t *p_this,

const char *name,

int money);

void human_talk (human_t *p_this,

const char *p_words);

void human_buy (human_t *p_this,

const char *p_something,

unsigned price,

unsigned count);

void human_deinit (human_t *p_this);

3 繼承的C語言實現(xiàn)

3.1 C語言不能實現(xiàn)嚴格的繼承

一種常見的用C語言實現(xiàn)繼承的方法如下面的代碼所示:

/* 父類 /基類*/

struct parent {

int a;

};

/* 子類/派生類 */

struct child {

struct parent base; /* 第一個成員為基類 */

int b;

};

void foo (void)

{

struct child foo;

struct child *p_child;

struct parent *p_parent;

p_child = &foo;

p_parent = (struct parent *)p_child;

/* 將子類轉(zhuǎn)換為父類 */

p_parent->a = 100; /* 訪問父類成員 */

}

上面的代碼中定義了一個父類和子類,foo()函數(shù)中實例化了一個子類對象,使用強制類型轉(zhuǎn)換將子類對象的指針p_child轉(zhuǎn)換為父類指針p_parent,如此達到了訪問其父類成員的效果。此方法有明顯的缺陷——使用了強制類型轉(zhuǎn)換,而在C語言編程中是要避免使用強制類型轉(zhuǎn)換的。如果要得到子類的父類,推薦下面這種更安全的方法:

p_parent = &p_child->base;

對于很多面向?qū)ο缶幊陶Z言來說,子類對象調(diào)用父類的屬性方法不需要顯式轉(zhuǎn)型,而C語言做不到這一點,比如,不能通過p_child->a直接訪問父類的屬性,因此,嚴格意義上說“C語言不能實現(xiàn)嚴格的繼承”。

3.2 用C語言實現(xiàn)繼承

在前面一節(jié)中指出“C語言不能實現(xiàn)嚴格的繼承”,盡管如此,由于繼承在軟件設計中時有使用,因此用C語言實現(xiàn)繼承仍是必要的。盡管繼承實現(xiàn)的效果不如C++等面向?qū)ο笳Z言那么完美,但還是可以達到實用程度的。

以圖1為例,Human為父類,Chinese為基類。Human類的實現(xiàn)請參考程序清單1,Chinese類的實現(xiàn)(chinese.h)請參考程序清單2,chinese.c為chinese.h中函數(shù)聲明的實現(xiàn),本文不討論這些細節(jié)。

程序清單2 Chinese類C語言實現(xiàn)

#include "human.h"

typedef struct chinese {

human_t super;

const char *city;

} chinese_t;

#define CHINESE_TO_HUMAN(p_chinese) 〗 (&((p_chinese)->super))

chinese_t *chinese_init (chinese_t *p_this, const char *name, int money, const char *city);

chinese_t *chinese_create(const char *name, unsigned int money, const char *city);

void chinese_play_mahjong (chinese_t *p_this);

void chinese_deinit (chinese_t *p_this);

void chinese_delete (chinese_t **pp_this);

Chinese類繼承Human類體現(xiàn)在struct chinese 結(jié)構(gòu)體中嵌入了其父類struct human成員,但這并不是完美的繼承,如果要訪問父類的屬性和方法,需要先調(diào)用CHINESE_TO_HUMAN()將子類指針轉(zhuǎn)型為父類指針。需要注意的是CHINESE_TO_HUMAN()并沒有使用強制類型轉(zhuǎn)換,這意味著struct chinese的成員super可以放在任意位置,大大提高了使用的安全性和靈活性。程序清單3展示了繼承相關(guān)特性的使用。

程序清單3 繼承的使用

chinese_t xiaoming, *p_xiaoming;

human_t *p_human;

p_ xiaoming = chinese_create(

"XiaoMing", 100, "Beijing"); // 實例化子類

p_human = CHINESE_TO_HUMAN(p_ xiaoming);

// 向上轉(zhuǎn)型,得到父類引用

human_talk(p_human, "Ni Hao! "); // 調(diào)用父類方法

chinese_play_mahjong(p_laowang); // 調(diào)用子類方法

4 結(jié)論

本文通過使用C語言實現(xiàn)Chinese類對Human類的繼承,討論了如何使用C語言來實現(xiàn)繼承。在C++等面向?qū)ο笳Z言中對類做了原生的支持,能夠很容易地實現(xiàn)。盡管C語言不能實現(xiàn)嚴格意義上的繼承,但是通過在一個結(jié)構(gòu)體中嵌入另一個結(jié)構(gòu)體的方式,也能達到繼承的效果,與其他面向?qū)ο笳Z言不同的是,調(diào)用父類方法時需要顯式轉(zhuǎn)型。

[1] 百度百科. 面向?qū)ο骩EB/OL].(2012-12-12)[2016-08-08]http://baike.baidu.com/link?url=6XlXEOSlrKn87S7SJv4U WSX7EjstoDVm-wJ13OAod-XUrUrnZkVg3ntPFir-Ey5c6mqObZZ OevQI6K3Ungq1Mq.

Research on the implementation of inheritance with C-language

Yang Tao

(Guangzhou Zhiyuan Electric Co., Ltd., Guangzhou 510660, China)

C-language is widely used in embedded software development. But because of some reasons of developers and application scenarios, object-oriented software development methods, design patterns and other outstanding have not made good use. Today, the rising of Internet of Things and other applications, brings new challenges to the development of embedded software, and the traditional process oriented development has been difficult to support these complex applications. Therefore, it is necessary to introduce object-oriented, design patterns and other excellent software development methods in embedded software development. Object oriented method is the foundation of modern software, and inheritance is one of the three characteristics of object-oriented. Combining with the characteristics of C-language, using C language to achieve inheritance is discussed in this paper.

C-language; object-oriented; class; inheritance

TP312

A

10.19358/j.issn.1674- 7720.2016.24.005

楊韜. 用C語言實現(xiàn)繼承的研究[J].微型機與應用,2016,35(24):16-18.

2016-09-15)

楊韜(1986-),男,學士,工程師,主要研究方向:嵌入式系統(tǒng)、軟件工程、軟件方法。

猜你喜歡
方法
中醫(yī)特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數(shù)學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 日韩天堂视频| 97久久人人超碰国产精品| 国产成人福利在线| 亚洲精品动漫| 国产成年无码AⅤ片在线 | a级免费视频| 91在线高清视频| 国产美女丝袜高潮| 精品亚洲国产成人AV| 久久久精品国产SM调教网站| 亚洲日韩久久综合中文字幕| 国产午夜福利亚洲第一| 亚洲第一极品精品无码| 亚洲91精品视频| av大片在线无码免费| 一级爆乳无码av| 青青青国产视频| 亚洲国产第一区二区香蕉| 在线看片国产| 99久久国产综合精品女同| 国产欧美精品午夜在线播放| 国产精品无码一二三视频| 欧美A级V片在线观看| av在线无码浏览| 国产在线97| 国产91导航| 狠狠色噜噜狠狠狠狠奇米777| 亚洲成年网站在线观看| 亚洲国产欧美国产综合久久 | 免费又黄又爽又猛大片午夜| 亚洲第一区在线| 亚洲国产精品无码AV| 亚洲综合二区| 天天色综网| 毛片视频网| 91色在线视频| 国产精品开放后亚洲| 欧美色香蕉| 欧美另类图片视频无弹跳第一页| 一级黄色片网| 日本免费福利视频| 永久天堂网Av| 成人福利免费在线观看| 亚洲一区精品视频在线| 国产精品爆乳99久久| 亚洲国产精品不卡在线| 久热中文字幕在线| 亚洲第一成人在线| 制服丝袜亚洲| 亚洲一区二区视频在线观看| 无码高潮喷水专区久久| 另类重口100页在线播放| 欧美成人精品高清在线下载| 国模沟沟一区二区三区| 久久黄色一级片| 亚洲色成人www在线观看| 精品無碼一區在線觀看 | 91丝袜在线观看| 女人18一级毛片免费观看| 99re在线免费视频| 99久久免费精品特色大片| 亚洲国产日韩在线成人蜜芽| 青青草国产免费国产| 欧美成人手机在线观看网址| 亚洲午夜综合网| 性视频久久| 亚洲精品自拍区在线观看| 67194亚洲无码| 国产手机在线ΑⅤ片无码观看| 国产区人妖精品人妖精品视频| a毛片在线播放| 国产欧美精品一区二区| 国产性生交xxxxx免费| 亚洲精品中文字幕午夜| 国产一级在线观看www色| 男人天堂亚洲天堂| 亚洲成人免费看| 男人天堂亚洲天堂| 欧美成人精品在线| 国产一区二区网站| 亚洲免费福利视频| www.av男人.com|