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

天下

記錄修行的印記

[OOD-More C++ Idioms] 內部類 (Inner Class)

 [OOD-More C++ Idioms] 內部類 (Inner Class)

內部類 (Inner Class)

目的

不用通過多重繼承就可以實現多套接口,同時可以自然地向上轉換(Up-casting)。
在單個抽象下提供相同接口的多個實現。
別名

動機

兩個獨立類庫通過不同的接口提供的虛函數簽名可能沖突,如果這時需要同時實現這兩個函數就會出現問題。示例如下:

class Base1  /// 來自月球
{
  public:
      virtual int open (int) = 0;
      /* virtual */ ~Base1() {}  // 不允許多態的析構函數
};

class Base2  /// 來自木星
{
  public:
      virtual int open (int) = 0;
      /* virtual */ ~Base2() {}  // 不允許多態的析構函數
};

class Derived : public Base1, public Base2
{
  public:
    virtual int open (int i)
    {
      // Wow! 到底來自哪里?
      return 0;
    }
    /* virtual */ ~Derived () {}
};


內部類慣用法就是用來解決這個問題。

解決方案及示例

仍然是上面的例子,兩個基類不用修改,改用如下方式實現子類:

#include <iostream>
class Base1  /// 來自月球
{
  public:
      virtual int open (int) = 0;
      /* virtual */ ~Base1() {}  // 不允許多態的析構函數
};

class Base2  /// 來自木星
{
  public:
      virtual int open (int) = 0;
      /* virtual */ ~Base2() {}  // 不允許多態的析構函數
};

class Derived  // 注意沒有繼承
{
  class Base1_Impl;
  friend class Base1_Impl;  // 注意聲明友元
  class Base1_Impl : public Base1  // 注意是公共繼承
  {
   public:
    Base1_Impl(Derived* p) : parent_(p) {}
    int open() override { return parent_->base1_open(); }

   private:
    Derived* parent_;
  } base1_obj;  // 注意成員變量.

  class Base2_Impl;
  friend class Base2_Impl;  // 注意聲明友元
  class Base2_Impl : public Base2  // 公共繼承
                     {
   public:
    Base2_Impl(Derived* p) : parent_(p) {}
    int open() override { return parent_->base2_open(); }

   private:
    Derived* parent_;
  } base2_obj;  // 成員變量

  int base1_open() { return 111; }  /// 實現
  int base2_open() { return 222; }  /// 實現

 public:

  Derived() : base1_obj(this), base2_obj(this) {}

  operator Base1&() { return base1_obj; }  /// 轉到Base1&
  operator Base2&() { return base2_obj; }  /// 轉到Base2&

}; /// class Derived

int base1_open(Base1& b1) { return b1.open(); }

int base2_open(Base2& b2) { return b2.open(); }

int main(void) {
  Derived d;
  std::cout << base1_open(d) << std::endl;  // Like upcasting in inheritance.
  std::cout << base2_open(d) << std::endl;  // Like upcasting in inheritance.
}

附個類圖便于理解:

inner_class

這里的類Derived并不是子類,而是通過內部的兩個嵌套類實現不同的接口,再橋接回到自己定義的兩個實現的函數: base1_open及base2_open。兩個嵌套類不會共享繼隨關系,通過Derived類提供的兩個轉換操作符可以實現Derived轉換到任意的基類。另外兩個內部類對象也免去了額外的生命周期管理,它們的生命周期與Derived對象一致。

已知的應用

譯注: 
Inner Class的概念來自于Java, 其本特征是嵌套類通過友元的方式可以使用外部類的私有成員變量和成員函數,從而支持更強的交互。而且通常這個內部類需要是私有的。 
以Chromium網絡模塊的Http Cache為例: 
sample

這是一個簡單的例子,并沒有多重繼承。更多的是強調了封裝和信息隱藏(HttpCache::Transaction是HttpCache內私有的類)的OO特性。

相關的慣用法

Interface Class
Capability Query
參考

Thinking in C++ Vol 2 - Practical Programming — by Bruce Eckel.

posted on 2016-01-15 15:17 天下 閱讀(381) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

<2011年3月>
272812345
6789101112
13141516171819
20212223242526
272829303112
3456789

導航

統計

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲永久在线| 欧美午夜不卡视频| 亚洲欧美色婷婷| 免费视频一区二区三区在线观看| 亚洲欧美一区二区三区极速播放| 免费成人高清视频| 久久久久久久久久看片| 欧美日韩一区二区三区| 欧美激情视频一区二区三区免费| 韩国一区二区三区美女美女秀| 在线视频免费在线观看一区二区| 亚洲日本va午夜在线影院| 欧美在线一级va免费观看| 亚欧成人在线| 国产精品久久久久三级| 99re成人精品视频| 中国成人亚色综合网站| 欧美精品v日韩精品v韩国精品v| 欧美国产日产韩国视频| 伊人成人在线| 久久男人资源视频| 麻豆精品精品国产自在97香蕉| 国内精品久久久久影院薰衣草| 午夜影院日韩| 久久精品国产综合| 国产在线观看精品一区二区三区| 亚洲欧美一区二区激情| 久久国产黑丝| 国产在线精品一区二区中文| 久久九九久久九九| 你懂的视频欧美| 亚洲区一区二| 欧美日韩精品三区| 一区二区三区回区在观看免费视频| 国产精品99久久久久久宅男 | 亚洲欧美日韩视频一区| 国产精品久久久久久久久| 在线中文字幕日韩| 午夜精品一区二区三区在线视 | 国产麻豆视频精品| 午夜精品成人在线| 久久久久九九九| 在线观看欧美亚洲| 欧美伦理91| 亚洲一区尤物| 欧美 日韩 国产一区二区在线视频| 在线观看欧美日韩国产| 欧美激情精品久久久| 一区二区三区国产盗摄| 久久精品国产久精国产一老狼 | 国产亚洲一级| 猫咪成人在线观看| 99在线热播精品免费| 欧美在线啊v一区| 亚洲欧洲视频| 国产精品尤物| 欧美成人xxx| 亚洲欧美日韩一区二区三区在线观看 | 国产女人aaa级久久久级| 久久gogo国模啪啪人体图| 欧美高清视频www夜色资源网| 亚洲调教视频在线观看| 国语自产精品视频在线看一大j8| 欧美xxx成人| 亚洲欧美日韩爽爽影院| 亚洲国产精品成人| 亚洲一卡二卡三卡四卡五卡| 久久精品国产一区二区三区| 麻豆9191精品国产| 狠久久av成人天堂| 欧美精品尤物在线| 久久国产视频网站| 亚洲伦理一区| 欧美sm极限捆绑bd| 欧美一级欧美一级在线播放| 亚洲欧洲一区| 国内精品美女av在线播放| 欧美日韩黄视频| 久久躁日日躁aaaaxxxx| 亚洲综合电影| 亚洲精品一区二区三| 免费日韩成人| 久久精品欧洲| 午夜精品一区二区三区四区| 99国产精品久久久| 亚洲丰满少妇videoshd| 国产亚洲欧美日韩一区二区| 欧美日韩精品一区二区在线播放| 久久午夜电影| 久久精品国产精品亚洲精品| 亚洲一区二区三区免费视频| 亚洲精品国产精品国自产观看| 久久九九免费视频| 欧美一区二区三区四区夜夜大片 | 伊人成人网在线看| 国产欧美日韩综合一区在线观看| 欧美精品黄色| 欧美aⅴ99久久黑人专区| 久久国产精品一区二区三区四区| 亚洲一二三区在线| 一区二区国产日产| 99riav国产精品| 亚洲精品1区| 亚洲第一黄色| 亚洲福利久久| 亚洲国产日韩欧美综合久久| 久热国产精品| 老司机久久99久久精品播放免费| 久久激情网站| 久久激情综合| 久久综合九色九九| 久久人人爽人人爽| 久久免费视频一区| 裸体一区二区| 亚洲大片av| 一区二区三区精品在线| 久久亚洲精品视频| 久久久精品2019中文字幕神马| 欧美一区影院| 久久亚洲私人国产精品va媚药| 久久精品99无色码中文字幕| 久久裸体艺术| 欧美高清成人| 欧美色区777第一页| 国产精品久久久91| 国产午夜精品一区二区三区视频| 国产亚洲欧美日韩日本| 揄拍成人国产精品视频| 亚洲青色在线| 亚洲自拍电影| 久久亚洲美女| 亚洲国产精品一区制服丝袜| 亚洲美女在线一区| 午夜精品久久久久久久| 久久久久久亚洲综合影院红桃 | 午夜激情综合网| 久久久久.com| 欧美电影在线播放| 99国内精品久久| 欧美一区二区黄色| 老司机67194精品线观看| 欧美精品二区三区四区免费看视频| 欧美日韩国产首页在线观看| 国产久一道中文一区| 在线精品在线| 亚洲欧美另类久久久精品2019| 久久久久久国产精品一区| 亚洲第一福利社区| 亚洲一区二区成人在线观看| 久久―日本道色综合久久| 欧美日韩国产影片| 国产自产2019最新不卡| 一本色道久久88综合亚洲精品ⅰ| 久久国产欧美日韩精品| 亚洲精品免费一二三区| 久久www成人_看片免费不卡| 欧美激情性爽国产精品17p| 国产日本欧洲亚洲| 一区二区av在线| 久久在线观看视频| 一区二区三区国产精华| 免费成人小视频| 国产一区在线观看视频| 亚洲一区免费视频| 欧美激情影院| 久久久99免费视频| 国产精品视频免费在线观看| 亚洲免费电影在线| 久色成人在线| 亚洲欧美日韩天堂| 欧美午夜精品一区二区三区| 亚洲人成人99网站| 快射av在线播放一区| 亚洲性图久久| 国产精品国产三级国产a| 亚洲免费观看高清完整版在线观看熊 | 在线视频一区二区| 欧美高清hd18日本| 在线看片一区| 久久久久一区二区三区| 亚洲一级网站| 国产精品国产一区二区| 在线视频欧美日韩| 亚洲精品1区2区| 欧美伦理一区二区| 99精品欧美| 亚洲激情午夜| 欧美日韩国产91| 99re66热这里只有精品4| 亚洲国产精品悠悠久久琪琪| 免费成年人欧美视频| 亚洲国产精品www| 欧美韩日一区二区| 麻豆av福利av久久av| 亚洲国产裸拍裸体视频在线观看乱了中文| 久久久精品免费视频| 久久不射电影网| 亚洲国产精品传媒在线观看| 免费在线欧美黄色| 免费欧美在线|