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

  楊韜

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

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

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

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

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

  0引言

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

1基本概念[1]

  1.1類

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

  類具有屬性,它是對象狀態的抽象,用數據結構來描述類的屬性。

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

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

  類是抽象的數據類型,在內存中并不存在(Python等動態語言除外),只有類的實例存在于內存中。

  1.2繼承

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

 

001.jpg

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

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

002.jpg

2類的C語言實現

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

  程序清單1Human類C語言實現

  // 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語言實現

  3.1C語言不能實現嚴格的繼承

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

  /* 父類 /基類*/

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

  p_parent = &p_child->base;

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

  3.2用C語言實現繼承

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

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

  程序清單2Chinese類C語言實現

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

參考文獻

  [1] 百度百科. 面向對象[EB/OL].(2012 12 12)[2016 08 08]http://baike.baidu.com/linkurl=6XlXEOSlrKn87S7SJv4U WSX7EjstoDVmwJ13OAodXUrUrnZkVg3ntPFirEy5c6mqObZZ OevQI6K3Ungq1Mq.

  

此內容為AET網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
国产精品99一区二区| 欧美久久久久久久久久| 亚洲国产精品久久人人爱蜜臀| 亚洲系列中文字幕| 亚洲精品在线三区| 亚洲国产欧美精品| 亚洲激情电影中文字幕| 亚洲高清久久| 亚洲高清不卡在线| 亚洲国产成人精品视频| 在线精品视频在线观看高清| 在线不卡中文字幕播放| 黄色精品一二区| 在线观看成人av| 精品成人在线视频| 永久久久久久| 尤物99国产成人精品视频| 激情综合中文娱乐网| 在线日韩精品视频| 91久久精品日日躁夜夜躁欧美| 91久久一区二区| 一区二区国产日产| 亚洲午夜日本在线观看| 亚洲在线视频观看| 欧美一区二区在线播放| 亚洲一区二区三区四区视频| 亚洲美女诱惑| 欧美亚洲三级| 亚洲国产美女精品久久久久∴| 91久久国产综合久久91精品网站| 亚洲欧洲综合另类| 在线视频精品| 午夜综合激情| 久久久精品tv| 欧美a级大片| 欧美三级电影精品| 国产精品爽黄69| 国产免费成人av| 一区二区三区在线高清| 亚洲激情视频在线播放| 99在线观看免费视频精品观看| 亚洲视频久久| 性欧美大战久久久久久久免费观看| 欧美亚洲免费电影| 亚洲激情视频在线观看| 一本久久综合亚洲鲁鲁五月天| 亚洲伊人第一页| 久久久xxx| 久久亚洲春色中文字幕久久久| 欧美高清不卡在线| 国产精品久久久久久久浪潮网站| 国产欧美日韩视频一区二区| 在线看一区二区| 中文亚洲免费| 久久精品亚洲乱码伦伦中文| 一区二区欧美国产| 久久成人18免费网站| 欧美成人性网| 国产精品午夜av在线| 在线成人h网| 中国av一区| 亚洲国产激情| 亚洲视频自拍偷拍| 久久日韩粉嫩一区二区三区| 欧美日韩福利| 国产一区在线播放| 99国产一区二区三精品乱码| 欧美影院视频| 亚洲一区二区久久| 麻豆成人综合网| 欧美婷婷在线| 在线日韩中文| 午夜精品美女久久久久av福利| 亚洲久久一区| 久久久国产成人精品| 欧美日韩在线视频一区二区| 激情久久久久久久久久久久久久久久 | 欧美系列一区| 亚洲大胆人体在线| 午夜在线视频观看日韩17c| 99精品视频免费在线观看| 久久亚洲欧美国产精品乐播| 欧美性一二三区| 亚洲激情国产| 亚洲国产精品成人| 欧美一区二区三区精品| 欧美日韩免费| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲一品av免费观看| 亚洲字幕在线观看| 欧美激情精品久久久久久久变态| 国产日韩欧美另类| 亚洲视频大全| 正在播放亚洲| 欧美黄色免费网站| 精品成人一区二区| 欧美亚洲在线| 午夜伦欧美伦电影理论片| 欧美日韩国产首页| 亚洲电影在线| 亚洲成在线观看| 久久精品电影| 国产精品自在在线| 亚洲一区免费在线观看| 一区二区高清在线观看| 欧美aa在线视频| 在线播放国产一区中文字幕剧情欧美| 欧美亚洲色图校园春色| 香蕉久久一区二区不卡无毒影院| 欧美日韩在线一区二区| 亚洲黄色在线看| 最新69国产成人精品视频免费| 久久久久中文| 国语自产偷拍精品视频偷| 欧美一区二区视频免费观看| 久久精品动漫| 国内精品福利| 久久国产欧美精品| 久久久综合激的五月天| 国产亚洲人成a一在线v站| 欧美夜福利tv在线| 久久久噜噜噜久久久| 国内成+人亚洲| 亚洲国产成人91精品| 麻豆精品视频| 最新国产拍偷乱拍精品 | 亚洲一级一区| 国产精品第三页| 亚洲午夜精品一区二区| 欧美在线播放一区| 国产一区二区三区久久 | 亚洲性色视频| 性18欧美另类| 国产一区99| 亚洲国产日日夜夜| 欧美激情视频一区二区三区在线播放 | 99成人免费视频| 欧美日韩免费| 亚洲性图久久| 欧美自拍偷拍| 激情综合网激情| 日韩视频不卡中文| 欧美日韩中文在线观看| 一区二区三区视频免费在线观看 | 欧美激情一区二区三区全黄| 亚洲一区影院| 欧美色播在线播放| 亚洲性视频网站| 久久精品视频在线免费观看| 在线观看中文字幕亚洲| 亚洲免费av电影| 国产精品99一区| 欧美在线网站| 欧美大片一区| 亚洲色图综合久久| 久久精品国产69国产精品亚洲 | 欧美一区国产一区| 黄色国产精品一区二区三区| 日韩亚洲成人av在线| 国产精品福利在线观看| 性欧美办公室18xxxxhd| 女人色偷偷aa久久天堂| 日韩一区二区精品| 久久久精品国产一区二区三区 | 国产精品私拍pans大尺度在线| 欧美一区二区三区日韩| 欧美高清视频一区| 亚洲影视九九影院在线观看| 快播亚洲色图| 亚洲天堂成人| 裸体歌舞表演一区二区| 99re视频这里只有精品| 久久精品国产69国产精品亚洲| 亚洲人精品午夜在线观看| 欧美一区二区三区成人| 亚洲欧洲另类国产综合| 欧美一区二区三区播放老司机| 亚洲区第一页| 久久精品国产999大香线蕉| 亚洲精品免费电影| 久久精品盗摄| 99国内精品久久| 久热国产精品| 亚洲性xxxx| 欧美精品粉嫩高潮一区二区 | 欧美jizz19hd性欧美| 亚洲一区二区三区欧美| 欧美国产激情二区三区| 午夜久久一区| 欧美日韩视频在线| 亚洲片区在线| 国产日韩一区二区三区在线播放 | 亚洲欧美日韩另类精品一区二区三区| 激情久久久久久久| 午夜一区在线| 亚洲精品一区在线观看| 久久一区激情| 亚洲免费影视| 欧美日韩精品系列| 亚洲国产成人精品久久久国产成人一区 |