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

天下

記錄修行的印記

[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 天下 閱讀(374) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

<2015年12月>
293012345
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>
            亚洲视频香蕉人妖| 欧美在线91| 欧美亚洲一区二区三区| 亚洲乱码国产乱码精品精98午夜| 亚洲一区二区三区视频| 久久精品国产亚洲5555| 欧美精品一区在线播放| 黄色成人在线观看| 欧美中文字幕在线观看| 亚洲性感美女99在线| 久久深夜福利| 在线看成人片| 欧美.www| 免费不卡视频| 亚洲精品一级| 亚洲精品视频二区| 欧美日韩亚洲一区二区| 99在线精品观看| 日韩一区二区精品葵司在线| 欧美日韩国产色视频| 一区二区不卡在线视频 午夜欧美不卡在 | 久久久久久亚洲精品杨幂换脸| 亚洲视频一区二区| 国产精品黄色| 久久成人免费电影| 欧美一级在线视频| 一色屋精品亚洲香蕉网站| 玖玖精品视频| 欧美精品97| 亚洲一区二区三区在线| 中文精品一区二区三区| 国产欧美精品一区二区色综合| 久久精品人人| 久久精品久久综合| 亚洲日韩中文字幕在线播放| 亚洲经典在线| 欧美日韩国产123| 亚洲欧美日韩在线综合| 小处雏高清一区二区三区| 影音欧美亚洲| 亚洲美女av网站| 国产日韩欧美精品综合| 欧美高清在线播放| 亚洲精品美女久久7777777| 亚洲午夜久久久久久久久电影网| 国产精品网红福利| 久久亚洲精品中文字幕冲田杏梨| 老司机一区二区| 亚洲午夜久久久| 久久久999精品免费| 日韩午夜电影av| 亚洲免费在线观看视频| 亚洲高清中文字幕| 亚洲午夜激情| 亚洲欧洲日本一区二区三区| 宅男精品视频| 亚洲黄色大片| 亚洲欧美视频在线| 日韩亚洲欧美成人一区| 午夜日韩电影| 在线一区日本视频| 久久久久国产精品www | 麻豆精品传媒视频| 欧美欧美全黄| 久久亚洲高清| 欧美午夜电影一区| 欧美激情视频一区二区三区在线播放| 欧美午夜精品电影| 亚洲第一久久影院| 国产一区二区三区久久久久久久久| 亚洲国产一区二区三区在线播| 国产网站欧美日韩免费精品在线观看 | 亚洲专区国产精品| 久久久久久久综合日本| 亚洲欧美日韩在线高清直播| 模特精品裸拍一区| 欧美伊久线香蕉线新在线| 欧美伦理在线观看| 欧美激情视频在线播放| 黑人操亚洲美女惩罚| 亚洲特黄一级片| 日韩视频三区| 欧美jizzhd精品欧美喷水 | 亚洲专区欧美专区| 99www免费人成精品| 久久久天天操| 久久日韩精品| 国产日韩欧美一区二区| 亚洲图片欧美一区| 亚洲欧美日韩一区二区三区在线观看 | 亚洲国产黄色片| 欧美一区影院| 欧美一级淫片播放口| 国产精品视频免费观看www| 99亚洲视频| 亚洲男人的天堂在线| 欧美日韩国产成人在线91| 日韩亚洲视频| 亚洲性xxxx| 国产精品久久久久久亚洲毛片| 亚洲视频欧洲视频| 亚洲综合色在线| 欧美午夜欧美| av成人免费| 亚洲欧美视频| 国产一区二区三区精品久久久| 久久国内精品自在自线400部| 欧美亚洲专区| 国产亚洲午夜高清国产拍精品| 香蕉av福利精品导航| 久久综合九九| 亚洲开发第一视频在线播放| 美日韩精品视频免费看| 亚洲第一成人在线| 久久狠狠亚洲综合| 国产婷婷一区二区| 久久精品一级爱片| 91久久午夜| 亚洲综合丁香| 激情视频一区二区| 欧美激情国产日韩| 亚洲午夜久久久| 久久综合九色欧美综合狠狠| 亚洲欧洲日本国产| 国产精品www色诱视频| 欧美一区二区视频观看视频| 欧美a级大片| 亚洲小视频在线观看| 国产一区免费视频| 欧美另类久久久品| 欧美一区二区三区免费观看视频| 欧美韩国日本一区| 香蕉av福利精品导航| 在线国产欧美| 国产精品久久| 男人的天堂亚洲| 亚洲综合第一页| 欧美国内亚洲| 久久久国产91| 亚洲视频香蕉人妖| 在线观看91久久久久久| 欧美视频日韩视频| 久久久久久久波多野高潮日日| 日韩午夜在线观看视频| 麻豆精品一区二区综合av| 国产精品99久久久久久www| 黑人巨大精品欧美黑白配亚洲| 欧美日本一区二区高清播放视频| 欧美一区二区三区视频免费| 亚洲裸体视频| 免费亚洲视频| 久久国产精品一区二区| 一区二区三区免费观看| 亚洲国产精品一区制服丝袜| 国产精品视频一区二区三区| 久久在线免费观看| 亚洲欧美日韩综合国产aⅴ| 亚洲精品国产精品久久清纯直播| 久久精品毛片| 亚洲中午字幕| 国产精品99久久久久久久女警| 在线观看免费视频综合| 国产精品久久久久久久久久免费看| 免费欧美网站| 久久久999精品免费| 香蕉免费一区二区三区在线观看| 99re视频这里只有精品| 亚洲激情不卡| 欧美va天堂va视频va在线| 久久亚洲综合| 久热精品视频在线观看| 久久精彩免费视频| 欧美一区二区在线视频| 亚洲欧美一区二区三区久久| 欧美巨乳在线观看| 久久精品人人爽| 午夜欧美大片免费观看| 午夜精品久久久久久99热| 亚洲五月六月| 亚洲一区黄色| 亚洲女性裸体视频| 亚洲综合欧美日韩| 亚洲欧美日韩国产另类专区| 亚洲永久网站| 午夜在线一区二区| 欧美一区视频在线| 久久国产婷婷国产香蕉| 久久久精品午夜少妇| 久久综合给合久久狠狠狠97色69| 久久久久99精品国产片| 久久久中精品2020中文| 久久在线免费观看视频| 欧美福利视频在线观看| 欧美精品麻豆| 欧美四级剧情无删版影片| 国产精品hd| 国产无一区二区| 伊人天天综合| 日韩写真在线| 午夜精品久久久久久久白皮肤 |