《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 用C語(yǔ)言實(shí)現(xiàn)繼承的研究
用C語(yǔ)言實(shí)現(xiàn)繼承的研究
楊韜
(廣州致遠(yuǎn)電子股份有限公司,廣東 廣州 510660)
摘要: C語(yǔ)言在嵌入式軟件開(kāi)發(fā)中被廣泛使用,但由于開(kāi)發(fā)人員和應(yīng)用場(chǎng)景等原因,面向?qū)ο?、設(shè)計(jì)模式等優(yōu)秀的軟件開(kāi)發(fā)方法始終沒(méi)有很好地運(yùn)用起來(lái)。時(shí)至今日,物聯(lián)網(wǎng)等應(yīng)用的興起給嵌入式軟件開(kāi)發(fā)帶來(lái)新的挑戰(zhàn),而傳統(tǒng)的面向過(guò)程開(kāi)發(fā)方法已經(jīng)難以支撐這些復(fù)雜的應(yīng)用。因此,有必要在嵌入式軟件開(kāi)發(fā)中引入面向?qū)ο?、設(shè)計(jì)模式等優(yōu)秀的軟件開(kāi)發(fā)方法。面向?qū)ο笫乾F(xiàn)在軟件方法的根基,繼承是面向?qū)ο蟮娜筇匦灾?,本文結(jié)合C語(yǔ)言的特性,對(duì)使用C語(yǔ)言實(shí)現(xiàn)繼承進(jìn)行了討論。
Abstract:
Key words :

  楊韜

 ?。◤V州致遠(yuǎn)電子股份有限公司,廣東 廣州 510660)

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

  關(guān)鍵詞: C語(yǔ)言;面向?qū)ο螅?a class="innerlink" href="http://m.jysgc.com/tags/類" title="類" target="_blank">類;繼承

  中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:ADOI: 10.19358/j.issn.1674-7720.2016.24.005

  引用格式:楊韜. 用C語(yǔ)言實(shí)現(xiàn)繼承的研究[J].微型機(jī)與應(yīng)用,2016,35(24):16-18.

  0引言

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

1基本概念[1]

  1.1類

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

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

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

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

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

  1.2繼承

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

 

001.jpg

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

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

002.jpg

2類的C語(yǔ)言實(shí)現(xiàn)

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

  程序清單1Human類C語(yǔ)言實(shí)現(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);

  voidhuman_talk(human_t *p_this,

  const char *p_words);

  voidhuman_buy (human_t *p_this,

  const char *p_something,

  unsigned price,

  unsigned count);

  voidhuman_deinit(human_t *p_this);

3繼承的C語(yǔ)言實(shí)現(xiàn)

  3.1C語(yǔ)言不能實(shí)現(xiàn)嚴(yán)格的繼承

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

  /* 父類 /基類*/

  struct parent {

  int a;

  };

  /* 子類/派生類 */

  struct child {

  struct parent base; /* 第一個(gè)成員為基類 */

  int b;

  };

  void foo (void)

  {

  struct childfoo;

  struct child *p_child;

  struct parent*p_parent;

  p_child = &foo;

  p_parent = (struct parent *)p_child;

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

  p_parent->a = 100;/* 訪問(wèn)父類成員 */

  }

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

  p_parent = &p_child->base;

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

  3.2用C語(yǔ)言實(shí)現(xiàn)繼承

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

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

  程序清單2Chinese類C語(yǔ)言實(shí)現(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成員,但這并不是完美的繼承,如果要訪問(wèn)父類的屬性和方法,需要先調(diào)用CHINESE_TO_HUMAN()將子類指針轉(zhuǎn)型為父類指針。需要注意的是CHINESE_TO_HUMAN()并沒(méi)有使用強(qiáng)制類型轉(zhuǎn)換,這意味著struct chinese的成員super可以放在任意位置,大大提高了使用的安全性和靈活性。程序清單3展示了繼承相關(guān)特性的使用。

  程序清單3繼承的使用

  chinese_txiaoming, *p_xiaoming;

  human_t*p_human;

  p_ xiaoming = chinese_create(

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

  p_human = CHINESE_TO_HUMAN(p_ xiaoming);

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

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

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

4結(jié)論

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

參考文獻(xiàn)

 ?。?] 百度百科. 面向?qū)ο螅跡B/OL].(2012 12 12)[2016 08 08]http://baike.baidu.com/linkurl=6XlXEOSlrKn87S7SJv4U WSX7EjstoDVmwJ13OAodXUrUrnZkVg3ntPFirEy5c6mqObZZ OevQI6K3Ungq1Mq.

  

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美呦呦网站| 午夜精品福利一区二区蜜股av| 日韩午夜在线电影| 亚洲成色精品| 狠狠色噜噜狠狠狠狠色吗综合| 国产精品久久久一本精品| 欧美精品自拍| 欧美精品在线视频观看| 欧美电影打屁股sp| 欧美aⅴ99久久黑人专区| 美日韩精品免费| 毛片av中文字幕一区二区| 久久青草欧美一区二区三区| 久久精品在线免费观看| 久久精品成人一区二区三区| 欧美一区二区三区免费视| 午夜亚洲性色视频| 欧美亚洲一区二区三区| 欧美一级视频| 久久激情综合网| 久久精品国产亚洲精品| 久久久久久国产精品一区| 久久久久久噜噜噜久久久精品| 久久久精品国产免大香伊 | 激情婷婷亚洲| 精品动漫一区二区| 亚洲激情欧美| 妖精成人www高清在线观看| 一区二区三区四区五区视频| 亚洲自拍偷拍福利| 欧美中文字幕第一页| 亚洲国产精品女人久久久| 亚洲精品综合久久中文字幕| 亚洲视频axxx| 久久激情视频免费观看| 久久综合九色99| 欧美日韩国产欧| 国产精品久久久久永久免费观看 | 国产精品尤物福利片在线观看| 国产欧美精品日韩精品| 狠狠综合久久av一区二区小说| 亚洲第一中文字幕在线观看| 亚洲毛片一区| 亚洲女人天堂av| 亚洲高清不卡av| 一区二区三区福利| 欧美在线精品一区| 欧美大胆a视频| 国产精品久线观看视频| 国产亚洲午夜| 亚洲精品美女在线观看播放| 亚洲在线观看| 91久久精品国产91久久性色| 在线一区欧美| 久久久国产午夜精品| 欧美精品在线视频观看| 国产麻豆日韩| 亚洲欧洲在线视频| 午夜精品一区二区三区在线视| 亚洲激情中文1区| 亚洲欧美美女| 欧美高清你懂得| 国产毛片一区二区| 亚洲激情视频在线| 性欧美1819sex性高清| 日韩视频一区二区| 欧美在线观看视频一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一 | 久久不射网站| 亚洲一区二区精品| 老司机aⅴ在线精品导航| 欧美性猛交99久久久久99按摩 | 亚洲国产欧美一区二区三区久久 | 亚洲欧美综合国产精品一区| 久久嫩草精品久久久久| 欧美午夜不卡| 亚洲国产日本| 校园春色综合网| 中日韩午夜理伦电影免费| 久久女同互慰一区二区三区| 欧美性开放视频| 亚洲电影视频在线| 午夜精品福利一区二区三区av| 日韩午夜高潮| 久色婷婷小香蕉久久| 国产欧美日韩三区| av不卡在线看| 亚洲精品一区二区三| 久久久久久香蕉网| 国产精品视频自拍| 一区二区三区视频观看| 亚洲精品一区中文| 麻豆av一区二区三区久久| 国产欧美一区二区在线观看| 在线亚洲欧美视频| 一区二区激情| 欧美精品国产一区二区| 黑人巨大精品欧美一区二区| 亚洲在线第一页| 亚洲伊人网站| 欧美日韩另类字幕中文| 亚洲国产精品va在线看黑人| 亚洲成色777777女色窝| 久久久www| 国产欧美一二三区| 亚洲一区二区三| 亚洲欧美国产精品va在线观看| 欧美视频一区二区三区| 亚洲精品欧美极品| 亚洲欧洲日产国码二区| 久久综合伊人77777| 黄色工厂这里只有精品| 欧美综合第一页| 久久久精品日韩| 国产亚洲日本欧美韩国| 销魂美女一区二区三区视频在线| 欧美一区二区免费观在线| 国产精品爽黄69| 亚洲综合清纯丝袜自拍| 小黄鸭精品aⅴ导航网站入口| 欧美婷婷久久| 亚洲一区在线免费| 久久av最新网址| 国产日韩av一区二区| 午夜精品久久99蜜桃的功能介绍| 欧美在线视频免费播放| 国产日产欧美a一级在线| 欧美一区成人| 久久亚洲午夜电影| 在线国产亚洲欧美| 亚洲人成网站999久久久综合| 欧美成人精品影院| 亚洲精品老司机| 亚洲永久免费av| 国产精品永久| 久久精品视频在线| 欧美国产精品va在线观看| 亚洲人成亚洲人成在线观看图片| 一区二区日韩精品| 国产精品露脸自拍| 午夜视频一区在线观看| 麻豆成人综合网| 亚洲精品久久久蜜桃| 亚洲在线播放电影| 国产一区二区三区av电影 | 欧美一区二区三区久久精品茉莉花 | 久久久999精品| 在线免费观看视频一区| 99热这里只有成人精品国产| 欧美视频在线不卡| 亚洲欧美激情在线视频| 久久久久久久欧美精品| 亚洲国产精品一区二区第一页| 在线视频精品一| 国产欧美69| 亚洲高清不卡| 欧美日韩高清不卡| 亚洲男女自偷自拍图片另类| 久久久久久久久久久久久女国产乱| 亚洲成色777777在线观看影院| 一本色道久久综合| 国产精品综合网站| 亚洲黄色片网站| 欧美视频久久| 久久精品视频免费| 欧美视频一区二区在线观看| 欧美一二三区精品| 欧美精品 国产精品| 亚洲免费一区二区| 免费黄网站欧美| 亚洲一区二区高清视频| 另类尿喷潮videofree| 亚洲美女性视频| 久久久九九九九| 99天天综合性| 老司机精品导航| 中国女人久久久| 美女91精品| 亚洲在线黄色| 欧美激情精品| 久久99在线观看| 欧美视频成人| 亚洲国产1区| 国产精品日本欧美一区二区三区| 亚洲高清在线视频| 国产精品乱码久久久久久| 91久久午夜| 国产精品一区亚洲| 99精品久久免费看蜜臀剧情介绍| 国产亚洲精品久久久久久| 在线中文字幕一区| 伊人久久av导航| 欧美一区二区高清| 99精品视频免费| 欧美成人官网二区| 欧美一区二区三区久久精品| 欧美日韩在线观看视频| 91久久久国产精品| 国产亚洲精品7777| 亚洲欧美国产毛片在线|