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

  楊韜

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

        摘要C語言在嵌入式軟件開發(fā)中被廣泛使用,,但由于開發(fā)人員和應用場景等原因,,面向對象、設計模式等優(yōu)秀的軟件開發(fā)方法始終沒有很好地運用起來,。時至今日,,物聯(lián)網(wǎng)等應用的興起給嵌入式軟件開發(fā)帶來新的挑戰(zhàn),而傳統(tǒng)的面向過程開發(fā)方法已經(jīng)難以支撐這些復雜的應用,。因此,,有必要在嵌入式軟件開發(fā)中引入面向對象、設計模式等優(yōu)秀的軟件開發(fā)方法,。面向對象是現(xiàn)在軟件方法的根基,,繼承是面向對象的三大特性之一,,本文結合C語言的特性,對使用C語言實現(xiàn)繼承進行了討論,。

  關鍵詞: C語言,;面向對象;,;繼承

  中圖分類號:TP312文獻標識碼:ADOI: 10.19358/j.issn.1674-7720.2016.24.005

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

  0引言

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

1基本概念[1]

  1.1類

  面向對象有三大特性:封裝,、繼承,、多態(tài),這些特性主要通過類來體現(xiàn),。類就是一個封裝了屬性以及相關操作的代碼的邏輯實體,。

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

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

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

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

  1.2繼承

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

 

001.jpg

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

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

002.jpg

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

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

  程序清單1Human類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);

  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語言實現(xiàn)

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

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

  /* 父類 /基類*/

  struct parent {

  int a;

  };

  /* 子類/派生類 */

  struct child {

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

  int b;

  };

  void foo (void)

  {

  struct childfoo;

  struct child *p_child;

  struct parent*p_parent;

  p_child = &foo;

  p_parent = (struct parent *)p_child;

  /* 將子類轉換為父類 */

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

  }

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

  p_parent = &p_child->base;

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

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

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

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

  程序清單2Chinese類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 結構體中嵌入了其父類struct human成員,,但這并不是完美的繼承,,如果要訪問父類的屬性和方法,需要先調用CHINESE_TO_HUMAN()將子類指針轉型為父類指針,。需要注意的是CHINESE_TO_HUMAN()并沒有使用強制類型轉換,,這意味著struct chinese的成員super可以放在任意位置,,大大提高了使用的安全性和靈活性。程序清單3展示了繼承相關特性的使用,。

  程序清單3繼承的使用

  chinese_txiaoming, *p_xiaoming;

  human_t*p_human;

  p_ xiaoming = chinese_create(

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

  p_human = CHINESE_TO_HUMAN(p_ xiaoming);

  // 向上轉型,,得到父類引用

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

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

4結論

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

參考文獻

  [1] 百度百科. 面向對象[EB/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)授權禁止轉載,。