亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言中的面向對象(2)-C語言的多態實現

2019-11-17 05:04:29
字體:
來源:轉載
供稿:網友
  相信很多人都看過設計模式方面的書,大家有什么體會呢?Bridge,PRoxy,Factory這些設計模式都是基于抽象類的。使用抽象對象是這里的一個核心。
      
  其實我覺得框架化編程的一個核心問題是抽象,用抽象的對象構建程序的主體框架,這是面向對象編程的普遍思想。用抽象構建骨架,再加上多態就形成了一個完整的程序。由于C++語言本身實現了繼續和多態,使用這樣的編程理念(理念啥意思?跟個風,嘿嘿)在C++中是十分普遍的現象,可以說Virtual(多態)是VC的靈魂。
 
  但是,使用C語言的我們都快把這個多態忘光光了。我常聽見前輩說,類?多態?我們用的是C,把這些忘了吧。很不幸的是,我是一個固執的人。這么好的東西,為啥不用呢。很興奮的,在最近的一些純C代碼中,我看見了C中的多態!下面且聽我慢慢道來。
 
  1. VC中的Interface是什么

  Interface:中文解釋是接口,其實它表示的是一個純虛類。不過我所要說的是,在VC中的Interface其實就是strUCt,查找Interface的定義,你可以發現有這樣的宏定義:

       #Ifndef Interface
       #define Interface struct
       #endif

  而且,實際上在VC中,假如一個類有Virtual的函數,則類里面會有vtable,它實際上是一個虛函數列表。實際上C++是從C發展而來的,它不過是在語言級別上支持了很多新功能,在C語言中,我們也可以使用這樣的功能,前提是我們不得不自己實現。
 
  2.C中如何實現純虛類(我稱它為純虛結構)

  比較前面,相信大家已經豁然開朗了。使用struct組合函數指針就可以實現純虛類。

  例子:     typedef struct {
        void  (*Foo1)();
        char  (*Foo2)();
        char*  (*Foo3)(char* st);
    }
    MyVirtualInterface;
      
  這樣假設我們在主體框架中要使用橋模式。(我們的主類是DoMyAct,接口具體實現類是Act1,Act2)下面我將依次介紹這些“類”。(C中的“類”在前面有說明,這里換了一個,是使用早期的數組的辦法)
 
  主類DoMyAct: 主類中含有MyVirtualInterface* m_pInterface; 主類有下函數:

    DoMyAct_SetInterface(MyVirtualInterface* pInterface)
    {
        m_pInterface= pInterface;
    }
    DoMyAct_Do()
    {
        if(m_pInterface==NULL) return;
        m_pInterface->Foo1();
        c=m_pInterface->Foo2();
    }

  子類Act1:實現虛結構,含有MyVirtualInterface  st[MAX]; 有以下函數:

    MyVirtualInterface* Act1_CreatInterface()
    {
        index=FindValid() //對象池或者使用Malloc !應該留在外面申請,實例化
        if(index==-1) return NULL;
        St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具體實現

        St[index].Foo2=Act1_Foo2;
        St[index].Foo3=Act1_Foo3;
        Return &st [index];
    }

  子類Act2同上。
 
  在main中,假設有一個對象List。List中存貯的是MyVirtualInterface指針,則有:

    if( (p= Act1_CreatInterface()) != NULL)
    List_AddObject(&List, p); //Add All
 
    While(p=List_GetObject()){
        DoMyAct_SetInterface(p);//使用Interface代替了原來大篇幅的Switch Case
        DoMyAct_Do();//不要理會具體的什么樣的動作,just do it
    }
 
    FREE ALL 更多文章 更多內容請看C/C++進階技術文檔專題,或    在微系統里面,比如嵌入式,通常使用對象池的技術,這個時候可以不用考慮釋放的問題(對象池預先沒有空間,使用Attach,在某個函數中申請一個數組并臨時為對象池分配空間,這樣函數結束,對象池就釋放了)
 
  但是在Pc環境下,由于程序規模比較大,更重要的是一些非凡的要求,使得對象的生命周期必須延續到申請的那個函數體以外,就不得不使用malloc,實際上即使在C++中,new對象的自動釋放始終是一個令人頭疼的問題,新的標準引入了智能指針。但是就我個人而言,我覺得將內存釋放的問題完全的交給機器是不可信任的,它只能達到準最佳。
 
  你知道設計java的垃圾回收算法有多困難嗎?現實世界是錯綜復雜的,在沒有先驗條件下,要想得到精確的結果及其困難。所以我說程序員要時刻將free記在心上,有關程序的健壯性和自我防御將在另外一篇文章中講述。
 
  3.純虛結構的退化

  下面我們來看看假如struct里面僅僅有一個函數是什么? 這個時候假如我們不使用struct,僅僅使用函數指針又是什么? 我們發現,這樣就退化為普通的函數指針的使用了。
 
  所以說,有的時候我覺得面向對象僅僅是一種形式,而不是一種技術。是一種觀點,而不是一種算法。但是,正如炭,石墨和鉆石的關系一樣,雖然分子式都是C,但是組成方法不一樣,表現就完全不一樣了!

  有的時候,我們經常被編程中瑣碎的事情所煩惱,而偏離了重心,其實程序可進化的特性是很重要的。有可能,第一次是不成功的,但是只要可進化,就可以發展。
 
  4.進階――類結構樹,父類不是純虛類的類

  前面僅僅講的是父類是純虛結構的情況 (面向對象建議的是所有類的基類都是從純虛類開始的), 那么當類層次比較多的情況下,出現父類不是純虛結構怎么辦呢。嘿嘿,其實在C中的實現比C++要簡單多了。因為C中各個函數是分散的。
 
  在這里使用宏定義是一個很好的辦法:比如兩個類Act1,ActByOther1“繼續”Act1:

    MyVirtualInterface* ActByOther1_CreatInterface()
    {
        index=FindValid() //對象池或者使用Malloc
        if(index==-1) return NULL;
        St[index].Foo1= ActByOther1_Foo1; // Act1_Foo1要在下面具體實現
        St[index].Foo2= ActByOther1_Foo2;
        St[index].Foo3= ActByOther1_Foo3;
        Return &st [index];

    }
 
    #define ActByOther1_Foo1 Act1_Foo1  //這就是繼續 嘿嘿
    ActByOther1_Foo2(){}                    //  可以修改其實現
    ActByOther1_DoByOther() {}         //當然就可以添加新的實現咯
 
  5.實例――可以參見H264的源碼,其中NalTool就是這樣的一個純虛結構。 更多文章 更多內容請看C/C++進階技術文檔專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久久久久久久| 亚洲欧洲黄色网| 日韩一二三在线视频播| 欧美激情免费看| 欧美精品久久久久久久| 国产日韩在线一区| 亚洲少妇激情视频| 韩国精品久久久999| 欧美成人自拍视频| 亚洲人在线观看| 日韩中文字幕在线播放| 在线视频中文亚洲| 一区二区三区日韩在线| 亚洲欧洲日产国产网站| 日本精品视频在线观看| 欧美国产精品va在线观看| 精品国产一区二区三区久久久狼| 亚洲综合中文字幕在线观看| 国产精品极品美女粉嫩高清在线| 国产精品久久久久久av福利| 中文在线不卡视频| 久久久国产精彩视频美女艺术照福利| 国产精品第一视频| 国产精品视频免费观看www| 亚洲一级片在线看| 国产精品户外野外| 日韩精品视频在线观看网址| 亚洲欧美日韩一区二区三区在线| 成人免费网站在线看| 欧美野外猛男的大粗鳮| 久久精品久久久久| 中文字幕av一区二区| 亚洲图片欧洲图片av| 国产精品久久久久久久电影| 欧美另类极品videosbest最新版本| 成人av番号网| 成人免费在线网址| 欧美日本中文字幕| 疯狂欧美牲乱大交777| 国产欧洲精品视频| 亚洲免费福利视频| 欧美怡红院视频一区二区三区| 欧美理论电影在线观看| 亚洲天堂成人在线| 亚洲91精品在线观看| 日韩一级黄色av| 亚洲人成网站999久久久综合| 欧美性极品少妇精品网站| 欧美成人免费全部| 欧美中文字幕在线| 91视频国产精品| 夜夜嗨av一区二区三区免费区| 中文字幕欧美日韩精品| 亚洲欧美国产一区二区三区| 久久久久亚洲精品国产| 一本色道久久88亚洲综合88| 亚洲在线免费视频| 国产精品久久久久久久av电影| 日本亚洲欧美成人| 富二代精品短视频| 亚洲精品成人av| 日韩av不卡电影| 久久久成人精品| 亚洲成人教育av| 一区二区三区久久精品| 国产a∨精品一区二区三区不卡| 日本欧美中文字幕| 91久久久久久久一区二区| 91在线看www| 9.1国产丝袜在线观看| 91国产高清在线| 91精品久久久久久久久中文字幕| 久久国产精品网站| 中文字幕在线成人| 久久久久久91| 麻豆精品精华液| 国产精品h在线观看| 国产精品电影网站| 国产一区二区三区在线观看网站| 久久久亚洲国产天美传媒修理工| 亚洲永久免费观看| 亚洲片国产一区一级在线观看| 精品久久久久久久久久国产| 97精品欧美一区二区三区| 国产精品av网站| 国产精品va在线| 久久久久久久久久久网站| 精品精品国产国产自在线| 亚洲综合大片69999| 日韩视频在线观看免费| 亚洲国产精品人久久电影| 中文字幕亚洲在线| 91精品国产成人| 日韩中文理论片| 久久免费视频网| 亚洲天堂男人天堂| 九色精品美女在线| 亚洲欧美中文日韩在线| 国产日韩欧美日韩大片| 亚洲精品成人久久电影| 国语自产精品视频在线看一大j8| 69久久夜色精品国产69| 97超级碰碰人国产在线观看| 国产精品wwwwww| 午夜精品蜜臀一区二区三区免费| 欧美国产日韩一区二区| 亚洲va久久久噜噜噜| 色综合五月天导航| 亚洲精品一区二区在线| 日韩欧美在线免费观看| 国产精品成人一区| 亚洲欧美国产va在线影院| 成人午夜两性视频| 98视频在线噜噜噜国产| 亚洲自拍偷拍一区| 综合网中文字幕| 欲色天天网综合久久| 国产视频亚洲精品| 奇米一区二区三区四区久久| 成人免费观看49www在线观看| 欧美成人全部免费| 美女国内精品自产拍在线播放| 亚洲国产成人久久| 最新国产精品拍自在线播放| 欧美人与物videos| 日韩视频中文字幕| 米奇精品一区二区三区在线观看| 日韩精品久久久久| 中文字幕亚洲综合久久筱田步美| 蜜臀久久99精品久久久无需会员| 欧美精品一本久久男人的天堂| 日韩专区中文字幕| 亚洲深夜福利在线| 亚洲人成网站999久久久综合| 欧美激情a在线| 精品一区二区电影| 在线观看国产成人av片| 亚洲欧洲一区二区三区久久| 2018中文字幕一区二区三区| 第一福利永久视频精品| 亚洲高清久久网| 国产欧美 在线欧美| 久久精品国产69国产精品亚洲| 欧美洲成人男女午夜视频| 亚洲午夜未满十八勿入免费观看全集| 国产精品一区二区三区成人| 粗暴蹂躏中文一区二区三区| 精品激情国产视频| 欧美激情手机在线视频| 热草久综合在线| 欧美午夜女人视频在线| 97久久精品视频| 欧美电影电视剧在线观看| 亚洲国产精彩中文乱码av在线播放| 国产精品视频自在线| 亚洲男人天堂2019| 日韩在线免费av| 亚洲国产精彩中文乱码av在线播放| 久久视频免费在线播放| 人人澡人人澡人人看欧美| 8x拔播拔播x8国产精品| 中文字幕亚洲综合久久| 不卡av电影在线观看| 国产视频精品久久久|