亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

        2017-01-09 06:19:02
        關鍵詞:基類子類嵌入式軟件

        楊 韜

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

        用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)繼承進行了討論。

        C語言;面向對象;類;繼承

        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)該操作的方法來描述。

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

        類是抽象的數(shù)據(jù)類型,在內存中并不存在(Python等動態(tà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和結構體來實現(xiàn)類,以圖1中Human類為例,可以使用human.h、human.c、struct human三個元素來完成封裝,human.c為human.h中函數(shù)聲明的實現(xiàn),本文不討論這些細節(jié),只給出human.h的關鍵代碼片段:

        程序清單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;

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

        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é)。

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

        程序清單3 繼承的使用

        chinese_t xiaoming, *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! "); // 調用父類方法

        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/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)、軟件工程、軟件方法。

        猜你喜歡
        基類子類嵌入式軟件
        基于C#面向對象程序設計的封裝、繼承和多態(tài)分析
        卷入Hohlov算子的某解析雙單葉函數(shù)子類的系數(shù)估計
        實時嵌入式軟件的測試技術
        電子測試(2018年10期)2018-06-26 05:54:08
        關于對稱共軛點的倒星象函數(shù)某些子類的系數(shù)估計
        全景相機遙控器嵌入式軟件V1.0 相關操作分析
        電子制作(2017年17期)2017-12-18 06:40:56
        空戰(zhàn)游戲設計實例
        一種基于用戶興趣的STC改進算法
        服裝學報(2015年1期)2015-10-21 01:20:30
        虛機制在《面向對象程序設計C++》中的教學方法研究
        基于Eclipse的航天嵌入式軟件集成開發(fā)環(huán)境設計與實現(xiàn)
        航天嵌入式軟件浮點運算誤差分析與控制
        亚洲av永久无码精品三区在线| 麻豆国产精品伦理视频| 精品国产自在现线看久久| 日韩精品极品视频在线观看免费| 国产欧美一区二区精品性色| 精品国产1区2区3区AV| 色婷婷亚洲精品综合影院| 国内少妇毛片视频| 久久久精品波多野结衣| 日韩无码尤物视频| 日本在线观看一二三区| 真实人与人性恔配视频| 在线观看免费午夜大片| 丰满少妇在线观看网站| 日本高清色惰www在线视频| 国产不卡在线播放一区二区三区| 久久精品国产99久久无毒不卡| 免费人成视频在线观看网站| 天堂69亚洲精品中文字幕| 久久久大少妇免费高潮特黄| 黄桃av无码免费一区二区三区| 国产精品乱码在线观看| 五码人妻少妇久久五码| 国产一区av男人天堂| 48沈阳熟女高潮嗷嗷叫| 国产精品玖玖玖在线资源| 高清不卡av在线播放| 国产三级在线观看完整版| 白嫩少妇激情无码| 亚洲区1区3区4区中文字幕码| 日韩亚洲精品国产第二页| 国产高潮刺激叫喊视频| 精品福利一区| 干出白浆视频在线观看| 影音先锋中文字幕无码资源站| 日韩成人免费一级毛片| 精品国产精品久久一区免费| 国产精品高清一区二区三区不卡| 亚洲综合一区无码精品| 狼人av在线免费观看| 国产精品亚洲专区无码不卡|