青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

思勤無邪

上學時,因我年齡最小,個頭也最小,上課時,就像大猩猩堆里的猴一般。如今,這猴偶爾也把最近的一些情況寫在這里。

   :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  132 Posts :: 1 Stories :: 178 Comments :: 0 Trackbacks

公告

     吾日常三省吾身,曰思、曰勤、曰無邪。

積分與排名

  • 積分 - 186375
  • 排名 - 140

最新隨筆

最新評論

閱讀排行榜

評論排行榜

 

 

      C++中封裝的概念是把一個對象的外觀接口同實際工作方式(實現(xiàn))分離開來,但是C++的封裝是不完全的,編譯器必須知道一個對象的所有部分的聲明,以便創(chuàng)建和管理它。我們可以想象一種只需聲明一個對象的公共接口部分的編程語言,而將私有的實現(xiàn)部分隱藏起來。C + +在編譯期間要盡可能多地做靜態(tài)類型檢查。這意味著盡早捕獲錯誤,也意味著程序具有更高的效率。然而這對私有的實現(xiàn)部分來說帶來兩個影響:一是即使程序員不能輕易地訪問實現(xiàn)部分,但他可以看到它;二是造成一些不必要的重復編譯

            然而C++并沒有將這個原則應用到二進制層次上,這是因為C++的類既是描述了一個接口同時也描述了實現(xiàn)的過程,示例如下:

 

class CMyString
{
private:
 
const int m_cch;
  
char *m_psz;
public:
  CMyString(
const char *psz);
  
~CMyString();
  
int Length() const;
  
int Index(const char *psz) const;
}

 

 

CMyStirng對外過多的暴露了內(nèi)存布局實現(xiàn)的細節(jié),這些信息過度的依賴于這些成員變量的大小和順序,從而導致了客戶過度依賴于可執(zhí)行代碼之間的二進制耦合關(guān)系,這樣的接口不利于跨語言跨平臺的軟件開發(fā)和移植。

 

1.1.1      Handle-Body模式

 

       解決這個問題的技術(shù)有一種叫句柄類( handle classes。有關(guān)實現(xiàn)的任何東西都消失了,只剩一個單一的指針“m_pThis”。該指針指向一個結(jié)構(gòu),該結(jié)構(gòu)的定義與其所有的成員函數(shù)的定義都出現(xiàn)在實現(xiàn)文件中。這樣,只要接口部分不改變,頭文件就不需變動。而實現(xiàn)部分可以按需要任意更動,完成后只要對實現(xiàn)文件進行重新編譯,然后再連接到項目中。

       下面是這項技術(shù)的簡單例子。頭文件中只包含公共的接口和一個簡單的沒有完全指定的類指針。

 

class CMyStringHandle
{
private:
  
class CMyString;
  CMyString 
*m_pThis;
public:
  CMyStringHandle (
const char *psz);
  
~ CMyStringHandle ();
  
int Length() const;
  
int Index(const char *psz) const;
}


CMyStringHandle:: CMyStringHandle(
const char *psz)
:m_pThis(
new CMyString(psz));
{
}


CMyStringHandle::
~ CMyStringHandle()
{
   delete m_pThis;
}


int CMyStringHandle::Length()
{
  
return m_pThis->Length();
}


int CMyStringHandle::Index(const char *psz)
{
 
return m_pThis->Index(psz);
}

 

    這是所有客戶程序員都能看到的。
            class CMyString

是一個沒有完全指定的類型說明或類聲明(一個類的定義包含類的主體)。它告訴編譯器,CMyString是一個結(jié)構(gòu)的名字,但沒有提供有關(guān)該結(jié)構(gòu)的任何東西。這對產(chǎn)生一個指向結(jié)構(gòu)的指針來說已經(jīng)足夠了。但我們在提供一個結(jié)構(gòu)的主體部分之前不能創(chuàng)建一個對象。在這種技術(shù)里,包含具體實現(xiàn)的結(jié)構(gòu)主體被隱藏在實現(xiàn)文件中。

 

            在設(shè)計模式中,這就叫做Handle-Body 模式,Handle-Body只含有一個實體指針,服務的數(shù)據(jù)成員永遠被封閉在服務系統(tǒng)中。

Handle-Body的布局結(jié)構(gòu)永遠不會隨著實現(xiàn)類數(shù)據(jù)成員的加入或者刪除或者修改而導致Handle-Body的修改,即Handle-Body協(xié)議不依賴于C++實現(xiàn)類的任何細節(jié)。這就有效的對用戶的編譯器隱藏了這些細節(jié),用戶在使用對這項技術(shù)時候,Handle-Body 接口成了它唯一的入口。

 

然而Handle-Body模式也有自己的弱點:

1、接口類必須把每一個方法調(diào)用顯示的傳遞給實現(xiàn)類,這在一個只有一個構(gòu)造和一個析構(gòu)的類來說顯然不構(gòu)成負擔,但是如果一個龐大的類庫,它有上百上千個方法時候,光是編寫這些方法傳遞就有可能非常冗長,這也增加了出錯的可能性。

2、對于關(guān)注于性能的應用每一個方法都得有兩層的函數(shù)調(diào)用,嵌套的開銷也不理想

3、由于句柄的存在,依然存在編譯連接器兼容性問題。

 

1.1.2        抽象接口

            使用了“接口與實現(xiàn)的分離”技術(shù)的 Handle-Body 解決了編譯器/鏈接器的大部分問題,而C++面向?qū)ο缶幊讨械某橄蠼涌谕瑯邮沁\用了“接口與實現(xiàn)分離”的思想,而采用抽象接口對于解決這類問題是一個極其完美的解決方案。

1、抽象接口的語言描述:

            class IMyString

            {

              virtual int Length() const = 0; //這表示是一個純虛函數(shù),具有純虛函數(shù)的接口

              virtual int Index(const char *psz) const = 0;

            }

 

2、抽象接口的內(nèi)存結(jié)構(gòu):

        抽象接口采用虛函數(shù)表來調(diào)用成員方法。 

3、   抽象接口的實現(xiàn)代碼:

              接口:

            class IMyString

            {

              virtual int Length() const = 0; //這表示是一個純虛函數(shù),具有純虛函數(shù)的接口

              virtual int Index(const char *psz) const = 0;

            }

             實現(xiàn):

            class CMyStringpublic IMyString

            {

            private:

             const int m_cch;

              char *m_psz;

            public:

              CMyString(const char *psz);

              virtual ~CMyString();

              int Length() const;

              int Index(const char *psz) const;

            }

            從上面采用抽象接口的實例來看,抽象接口解決了Handle-Body所遺留下來的全部缺陷。

抽象接口的一個典型應用:

            抽象工廠(AbstractFactroy

 

1.2       多繼承與菱形缺陷、this跳轉(zhuǎn)等

多重繼承是C++語言獨有的繼承方式,其它幾乎所有語言都秉承了單一繼承的思想。這是因為多重繼承致命的缺陷導致的:

1.2.1        菱形缺陷

當繼承基類時,在派生類中就獲得了基類所有的數(shù)據(jù)成員副本。假如類B A1A2兩個類多重繼承而來,這樣B類就包含A1A2類的數(shù)據(jù)成員副本。

考慮如果A1A2都從某基類派生,該基類稱為Base,現(xiàn)在繼承關(guān)系將出現(xiàn)菱形繼承關(guān)系。


我們C++語言來描述這種繼承關(guān)系:

 

class Base{ }

class A1 :public Base { }

class A2 :public Base { }

class B :public A1,public A2 { }

 

那么A1A2都具有Base的副本。這樣B就包含了Base的兩個副本,副本發(fā)生了重疊,不但增加了存儲空間,同時也引入了二義性。這就是菱形缺陷,菱形缺陷的兩個缺陷:

1、子對象重疊

2、向上映射的二義性。

菱形缺陷的其中一種解決辦法是使用虛擬繼承。

 

C++世界里最廣泛的使用虛擬繼承解決菱形缺陷的應用便是標準C++的輸入/輸出iostream

 

 

 

1.2.2        多重接口與方法名沖突問題(Siamese twins

       對繼承而來的虛函數(shù)改寫很容易,但是如果是在改寫一個“在兩個基類都有相同原型”的虛函數(shù)情況就不那么容易了。

       提出問題:

       假設(shè)汽車最大速度的接口為ICar,潛艇最大速度的接口為 IBoat,有一個兩棲類的交通工具它可以奔跑在馬路上,也可以航行在大海中,那么它就同時擁有ICarIBoat兩種交通工具的最大速度特性,我們定義它的接口為ICarBoat

       class ICar

       {

             virtual int GetMaxSpeed()= 0

       }

       class IBoat

       {

      virtual int GetMaxSpeed()= 0

       }

   我們先對ICarBoat的接口做一個嘗試:

       class CCarBoat

       {

              virtual int GetMaxSpeed();//既完成ICarGetMaxSpeed()接口方法又                                     //完成IBoat的接口方法?顯然不能夠

       };

解決問題:

       顯然上面這個嘗試根本就無法成功,只用一個實現(xiàn)方法,怎么能夠求出這個ICarBoat交通工具奔跑在馬路上的最高時速,同時也能夠求出航行在大海上的最大航行速度呢。

       上面這一問題矛盾就在一一個方法,卻需要兩個答案。看來ICarBoat要返回兩個答案就必須有兩個方法了,我們假設(shè)一個方法是求在陸地上奔跑的速度,名稱為GetCarMaxSpeed();另一個方法是求在大海上航行的最大速度,名稱為GetBoatMaxSpeed();那這兩個方法又怎么和GetMaxSpeed()接口方法聯(lián)系起來呢;

 

       幸運的是,我們找到了解決辦法,而且解決辦法有很多種,下面介紹一下繼承法。

       class IXCar :public ICar

       {

             virtual int GetMaxSpeed()

              {

                     GetCarMaxSpeed();

              }

              virtual int GetCarMaxSpeed() = 0;

       }

       class IXBoat:public IBoat

       {

              virtual int GetMaxSpeed()

              {

                     GetBoatMaxSpeed();

              }

              virtual int GetBoatMaxSpeed() = 0;

       }

       classCCarBoat: public IXCar , public IXBoat

       {

              virtual int GetCarMaxSpeed()

              {

                     … …

              }

              virtual int GetBoatMaxSpeed()

              {

                     … …

              }

       };

      

 

           

1.2.3        this跳轉(zhuǎn)

this跳轉(zhuǎn)是指的“對象同一性”問題。

      在單一繼承的世界內(nèi),無論繼承關(guān)系怎么復雜,針對于同一對象,無論它的子類或者父類的this指針永遠相等。即如果 BA繼承,那么 對于一個已經(jīng)實例化B類的對象 bObject,永遠有(B*&bObject ==(A*)&bObject 成立。

      但是在多繼承的世界內(nèi),上面的等式就不能恒成立,對象的同一性受到了挑戰(zhàn)。

      特別的是,在多繼承世界內(nèi)如果菱形關(guān)系存在情況下,如果對于已經(jīng)實例化B類的對象bObject; Base*)(A1*&bObject != Base*)(A2*&bObject 成立,當這種事情發(fā)生的時候我們就只能特殊處理了。這種情況在COM應用中處處都會發(fā)生。

 

1.3       C++多態(tài)的兩種多態(tài)形式和區(qū)別

     C++有兩種多態(tài)多態(tài)形式:

1、編譯時刻多態(tài),編譯時刻多態(tài)依靠函數(shù)重載或者模板實現(xiàn)

2、運行時刻多態(tài)。運行時刻多態(tài)依靠需函數(shù)虛接口實現(xiàn)

posted on 2007-07-21 16:18 思勤無邪 閱讀(2244) 評論(2)  編輯 收藏 引用 所屬分類: C++

Feedback

# re: 聊聊封裝、繼承 2007-08-09 20:55
這好像是華為的培訓資料呀  回復  更多評論
  

# re: 聊聊封裝、繼承 2007-12-12 09:09 虎子
不錯,不錯  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费欧美在线视频| 亚洲精品欧洲| 亚洲精品国产精品国产自| 激情久久久久久久| 在线免费观看日韩欧美| 亚洲国产成人精品女人久久久| 亚洲六月丁香色婷婷综合久久| 亚洲乱码久久| 一区二区三区久久久| 亚洲综合不卡| 久久久久9999亚洲精品| 女人天堂亚洲aⅴ在线观看| 亚洲国产精品va| 亚洲日本理论电影| 亚洲一区免费网站| 久久久久久亚洲精品杨幂换脸| 久久日韩精品| 欧美日韩亚洲一区二区| 国产区精品在线观看| 在线精品亚洲一区二区| 亚洲午夜国产一区99re久久| 久久国产精品网站| 欧美日韩另类视频| 黄色在线一区| 在线视频欧美日韩| 乱码第一页成人| 一区二区三区欧美| 玖玖综合伊人| 国产视频一区二区在线观看 | 久久只精品国产| 欧美午夜免费| 亚洲国产日韩综合一区| 午夜精品久久久久久久男人的天堂 | 欧美a级一区| 国产精品欧美激情| 亚洲日韩欧美视频一区| 久久国产精品一区二区三区四区 | 欧美资源在线观看| 欧美新色视频| 日韩天天综合| 欧美激情一区| 久久躁日日躁aaaaxxxx| 国产深夜精品福利| 欧美一级成年大片在线观看| 亚洲免费福利视频| 欧美久色视频| 亚洲伦理在线免费看| 免费亚洲视频| 久久综合狠狠| 亚洲国产精品成人| 免费欧美高清视频| 久久伊伊香蕉| 欧美不卡一卡二卡免费版| 亚洲免费视频一区二区| 欧美视频在线观看一区| 99天天综合性| 亚洲精品综合久久中文字幕| 欧美成人一区二区| 99re6热只有精品免费观看| 亚洲国产第一| 欧美精品一区二区三区蜜桃| 亚洲精品中文字幕女同| 亚洲精品久久久久久久久久久久久| 六月婷婷久久| 99re热这里只有精品免费视频| 欧美国产激情二区三区| 蜜桃精品一区二区三区| 亚洲蜜桃精久久久久久久| 亚洲精品久久久久久久久久久久 | 亚洲日本va在线观看| 欧美激情在线有限公司| 亚洲午夜一级| 午夜久久一区| 曰本成人黄色| 亚洲国产欧美在线人成| 欧美另类在线播放| 午夜久久久久久久久久一区二区| 亚洲中午字幕| 在线日韩日本国产亚洲| 亚洲人成在线观看| 国产精品一区视频网站| 久久久福利视频| 欧美成人午夜激情| 亚洲一区二区精品在线| 午夜精品免费视频| 亚洲国产精品一区二区www| 亚洲免费观看| 国产日韩欧美在线一区| 欧美高清在线精品一区| 国产精品国产三级国产普通话蜜臀| 久久成人精品无人区| 欧美~级网站不卡| 欧美一二三视频| 欧美顶级艳妇交换群宴| 欧美一区二区三区在线| 欧美不卡三区| 久久人人97超碰精品888| 欧美日韩成人在线| 老司机精品导航| 国产精品久久久久毛片软件| 农村妇女精品| 国产精品一区三区| 亚洲精品中文字幕在线观看| 国模精品娜娜一二三区| 一区二区成人精品| 亚洲国产精品一区| 欧美在线视频播放| 亚洲欧美另类在线| 欧美高清不卡| 欧美激情精品久久久久久黑人| 国产精品美女www爽爽爽视频| 欧美大片在线影院| 国外成人网址| 国产精品毛片一区二区三区 | 久久一区二区三区四区| 欧美三级网址| 亚洲国产欧美一区二区三区丁香婷 | 午夜精品久久久| 亚洲天堂男人| 欧美激情一区二区三区蜜桃视频| 久久网站免费| 国产亚洲福利| 亚洲中无吗在线| 亚洲一区二区三区四区五区午夜| 欧美jizz19性欧美| 欧美承认网站| 亚洲国产日韩欧美在线99| 久久精品欧洲| 久久亚洲精品视频| 在线观看av不卡| 久久一区欧美| 欧美高清视频在线| 亚洲日本欧美天堂| 欧美日本韩国在线| 亚洲精品免费观看| 中文在线资源观看视频网站免费不卡| 久久亚洲精品视频| 欧美成人小视频| 亚洲区中文字幕| 欧美精品一区三区| 日韩一二三在线视频播| 亚洲剧情一区二区| 欧美激情小视频| 日韩一级黄色大片| 性做久久久久久免费观看欧美| 国产精品夜夜夜| 午夜精品久久久99热福利| 久久久国产成人精品| 曰韩精品一区二区| 欧美激情精品久久久久久蜜臀| 亚洲看片网站| 欧美一区二区在线| 影音先锋一区| 欧美区高清在线| 亚洲一区二区三区三| 久久精品欧洲| 亚洲美女黄网| 国产精品色婷婷| 久久久久在线观看| 亚洲精品一区在线| 久久久久国产精品厨房| 亚洲精品欧美一区二区三区| 国产精品红桃| 免费观看一级特黄欧美大片| 夜夜嗨一区二区| 久久久噜噜噜| 在线一区日本视频| 国外精品视频| 欧美性感一类影片在线播放| 久久成人18免费网站| 亚洲欧洲在线播放| 久久精品国产一区二区电影| 91久久线看在观草草青青| 国产精品国产亚洲精品看不卡15| 久久久夜精品| 亚洲免费影视| 亚洲国产综合视频在线观看| 久久精品91久久香蕉加勒比| 日韩视频―中文字幕| 国产亚洲福利一区| 欧美日韩在线播放三区| 麻豆av福利av久久av| 两个人的视频www国产精品| 欧美日韩一卡二卡| 久久综合九九| 欧美一区二区成人6969| 99re热精品| 亚洲电影av| 久久午夜av| 久久国产精品黑丝| 亚洲一区二区三区在线观看视频| 在线日本成人| 国语自产精品视频在线看一大j8 | 国模大胆一区二区三区| 欧美色另类天堂2015| 欧美成人69av| 老司机久久99久久精品播放免费| 亚洲女同精品视频| 日韩亚洲视频在线| 亚洲精品之草原avav久久|