Boolan微專(zhuān)業(yè)-面向?qū)ο蟾呒?jí)編程學(xué)習(xí)筆記(Week03)

Object Oriented Programming(OOP)

類(lèi)與類(lèi)的關(guān)系

  • Inheritance(繼承)
  • Composition(復(fù)合)
  • Delegation(委托)

1. Composition(復(fù)合)动分,表示 has-a

Adapter

容器 A 包含實(shí)現(xiàn)多種功能的類(lèi) B, A 可選擇性包含部分 B 中需要的部分

  • Composition
  • // queue 'has-a' deque
    template <class T>
    class queue{
      ....
      protected:
        deque<T> c; //底層容器
      public:
        // 以下完全利用 c 的操作函數(shù)完成
        bool empty() const { retrun c.empty;}
        size_type size() const { return c.size(); }
        ....
    }
    void push(const value_type& x) { c.push_back(x); }
    void pop() { c.pop_front(); }
    

大小計(jì)算

復(fù)合類(lèi)的大小由復(fù)合的類(lèi)的大小決定,計(jì)算式逐個(gè)相加

  •  // Sizeof: 40
     template<clss T>
     class queue {
       protected:
         deque<T> c;
         ...
     };
    
    // Sizeof: 16 * 2 + 4 + 4
    template <class T>
    class deque {
      protected:
        Itr<T> start;
        Itr<T> finish;
        T** map;
        unsigned int map_size;
    };
    
    // Sizeof: 4 * 4
    template <class T>
    struct Itr{
      T* cur;
      T* first;
      T* last;
      T* node;
    ....
    };
    

構(gòu)造和析構(gòu)

  • 構(gòu)造由內(nèi)而外
    由內(nèi)而外基礎(chǔ)才穩(wěn)定鳍悠,要做一個(gè)東西袁余,要先弄地基
    // Container 的構(gòu)造函數(shù)首先調(diào)用 Component 的 default 構(gòu)造函數(shù)脉让,然后才執(zhí)行自己
    // "Component()"由編譯器
    Container::Container(...): Component() {}; 
    
    // 如果 default 的構(gòu)造函數(shù)不滿(mǎn)足要求,需要手動(dòng)寫(xiě)明需要調(diào)用的構(gòu)造函數(shù)
    Container::Container(...): Component(...) {}; 
    
  • 析構(gòu)由外而內(nèi)
    想象在拆掉一個(gè)東西的時(shí)候需要由外而內(nèi)一層層的拆
    // Container 的析構(gòu)函數(shù)首先執(zhí)行自己,然后才調(diào)用 Component 的析構(gòu)// 
    // "~Component()"由編譯器添加
    Container::~Container(...): {.... ~Component() }; 
    

2. Delegation(委托),Composition By Reference

Handle / Body

容器 A 中只包含指向功能 B 的指針,需要使用時(shí)才實(shí)例化 B 對(duì)象(可在任何時(shí)候?qū)⑷蝿?wù)“委托”)壶栋。“編譯防火墻”普监,需要修改時(shí)修改 B 即可贵试。

  • class StringRep;
    class String {
      public:
        String();
        ...
      private:
        StringRep* rep;  //pimpl (point to implementation)
    }
    
  • Delegation
  • Reference Counting(共享技術(shù))


    Reference Counting

3. Inheritance(繼承),表示 is-a

  • struct _List_node_base{
      _List_node_base* _M_next;
      _List_node_base* _M_prev;
    };
    
    template<typename _Tp>
    struct _List_node: public _List_node_base {
      _Tp _M_data;
    }
    

構(gòu)造和析構(gòu)

  • Inheritance
  • 構(gòu)造由內(nèi)而外
    • Derived 的構(gòu)造函數(shù)首先調(diào)用 Base 的 default 構(gòu)造函數(shù)凯正,然后才執(zhí)行自己毙玻。
    • Derived::Derived(...): Base() { ... };
  • 析構(gòu)由外而內(nèi)
    • Derived 的析構(gòu)函數(shù)首先執(zhí)行自己,然后才調(diào)用 Base 的析構(gòu)函數(shù)廊散。
    • Derived::~Derived(...): { ... ~Base(); };
  • Base 的析構(gòu)函數(shù)一定要是 virtual 的桑滩,否則會(huì)出現(xiàn) undefined behavior
  • (擴(kuò)展)用基類(lèi)指針去操作子類(lèi)對(duì)象時(shí),若基類(lèi)的析構(gòu)函數(shù)不是虛函數(shù)允睹,則在施放內(nèi)存時(shí)只會(huì)調(diào)用基類(lèi)的析構(gòu)函數(shù)运准,造成內(nèi)存泄漏。

Inheritance With Virtual Function

  • class Shape {
      public:
        virtual void draw() const = 0;                // pure virtual
        virtual void error(const std::string& msg);   // impure virtual
        int objectID() const;                         // non-virtual
        ...
    }
    
    • pure virtual 函數(shù): 你希望 derived class 一定要重新定義它缭受,你對(duì)它沒(méi)有默認(rèn)定義胁澳。
    • virtual 函數(shù):你希望 derived class 重新定義它,且你對(duì)它已有默認(rèn)定義米者。
    • non-virtual 函數(shù):你不希望 derived class 重新定義它韭畸。
  • 應(yīng)用
    • Template Method


      Template Method

對(duì)象組合

Inheritance + Composition

  • Inheritance + Composition
  • 構(gòu)造由內(nèi)而外
    • Derived 的構(gòu)造函數(shù)首先調(diào)用 Base 的 default 構(gòu)造函數(shù)宇智,然后調(diào)用 Component 的 default 構(gòu)造函數(shù),最后才調(diào)用自己胰丁。
    • Derived::Derived(...): Base(), Component() { ... };
  • 析構(gòu)由外而內(nèi)
    • Derived 的析構(gòu)函數(shù)首先執(zhí)行自己随橘,然后調(diào)用 Component 的析構(gòu)函數(shù),最后調(diào)用 Base 的析構(gòu)函數(shù)锦庸。
    • Derived::~Derived(...): { ...~Component(), ~Base(); };

Delegation + Inheritance

(1).Observer

Observer

  • Subject 包含一個(gè)委托容器 Observer
  • Observer 類(lèi)可繼承
  • Subject 控制流程机蔗,讓 Observer 的子類(lèi)根據(jù)需求來(lái)注冊(cè)、注銷(xiāo)

(2). Composite

103.png

  • Composite---add不能寫(xiě)成純虛函數(shù)酸员,因?yàn)镻rimitive沒(méi)有add的動(dòng)作蜒车,如文件是不能有+的動(dòng)作的讳嘱,只有文件夾才有

(3). Prototype (Design Patterns Explained Simply)

Prototype

  • 創(chuàng)建未來(lái)的對(duì)象幔嗦,需要每個(gè)子類(lèi)自己創(chuàng)建一個(gè)自己給父類(lèi),讓父類(lèi)可以看到

  • LandSatImage(子類(lèi)) 創(chuàng)建靜態(tài)的自己掛接到框架中-addPrototype

  • Image(框架)用于創(chuàng)建未知的子類(lèi)-findAndClone

  • 代碼圖:

    • 負(fù)號(hào)代表private,#代表protected,正好or不寫(xiě)代表public
    • 先寫(xiě)名字沥潭,在寫(xiě)類(lèi)型(如果必要)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邀泉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钝鸽,更是在濱河造成了極大的恐慌汇恤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔恰,死亡現(xiàn)場(chǎng)離奇詭異因谎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)颜懊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)财岔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人河爹,你說(shuō)我怎么就攤上這事匠璧。” “怎么了咸这?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵夷恍,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我媳维,道長(zhǎng)酿雪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任侄刽,我火速辦了婚禮指黎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唠梨。我一直安慰自己袋励,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著茬故,像睡著了一般盖灸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上磺芭,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天赁炎,我揣著相機(jī)與錄音,去河邊找鬼钾腺。 笑死徙垫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的放棒。 我是一名探鬼主播姻报,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼间螟!你這毒婦竟也來(lái)了吴旋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤厢破,失蹤者是張志新(化名)和其女友劉穎荣瑟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體摩泪,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笆焰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了见坑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嚷掠。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鳄梅,靈堂內(nèi)的尸體忽然破棺而出叠国,到底是詐尸還是另有隱情,我是刑警寧澤戴尸,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布粟焊,位于F島的核電站,受9級(jí)特大地震影響孙蒙,放射性物質(zhì)發(fā)生泄漏项棠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一挎峦、第九天 我趴在偏房一處隱蔽的房頂上張望香追。 院中可真熱鬧,春花似錦坦胶、人聲如沸透典。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峭咒。三九已至税弃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凑队,已是汗流浹背则果。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留漩氨,地道東北人西壮。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叫惊,于是被迫代替她去往敵國(guó)和親款青。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容