多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > [OOD-More C++ Idioms] 內部類 (Inner Class)

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

來源:程序員人生   發布時間:2016-02-29 16:54:00 閱讀次數:3813次

內部類 (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 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對象1致。

已知的利用

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

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

相干的慣用法

  • Interface Class
  • Capability Query
  • Thinking in C++ Vol 2 - Practical Programming ― by Bruce Eckel.
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲精品久久片久久 | 亚洲一区二区欧美日韩 | 亚洲www在线 | 亚洲欧美久久精品1区2区 | 亚洲天堂小视频 | 黄色中文字幕在线观看 | 一级女性全黄生活片免费看 | 在线播放精品视频 | 69视频最新在线观看 | 成人男女啪啪免费观看网站 | 国产一级淫片免费大片 | 久久久久一区二区三区 | 99影视在线视频免费观看 | 欧美精品亚洲精品日韩一区 | 日本中文在线播放 | 乱小说欧美综合 | 日本美女影院 | 国产亚洲精品美女一区二区 | 精品国产91久久久久久久 | 波多野结衣福利 | 现代激情校园春色 | 亚洲欧美一区二区三区蜜芽 | 最近2019中文字幕免费大全8 | 综合图片区 | 91人人干 | free性vido另类重口 | 国产亚洲综合激情校园小说 | 国产毛片久久久久久国产毛片 | 国产精品免费久久久免费 | 色偷偷青青草原在线视频 | 午夜视频免费 | 免看一级a毛片一片成人不卡 | 亚洲一区欧美 | 中文字幕无线 | 亚洲地址一地址二地址三 | 国产性一交一乱一伦一色一情 | 一级做a爰片久久毛片看看 一级做a爰片久久毛片美女 | 欧美性色黄大片www喷水 | 中文字幕最新中文字幕中文字幕 | 美国毛片亚洲社区在线观看 | 久久天天躁夜夜躁狠狠85台湾 |