GeekBand C++面向?qū)ο蟾呒?jí)編程(上) Thrid Week

GeekBand C++面向?qū)ο蟾呒?jí)編程(上) Thrid Week

面向?qū)ο缶幊?Object Oriented Progamming)

Inheritance (繼承)

繼承表示一種 ‘is-a' 的關(guān)系辽社。有基類(base class) 和 派生類(derived class)。 繼承分為單個(gè)繼承和多重繼承,同時(shí)繼承的訪問(wèn)權(quán)限也有public,private会油,protected(默認(rèn)是private)地消。

class Shape
{
public:
    Shape() {}
    virtual ~Shape() {}
private:
    int no_;
};

class Rectangle: public Shape
{
public:
    Rectangle() {}
    virtual ~Rectangle() {}
private:
    int x_;
    int y_;
};

Rectangle 繼承自 Shape,Rectangle可以訪問(wèn)基類的成員函數(shù)徽龟。
繼承關(guān)系的構(gòu)造函數(shù)是由內(nèi)而外贤旷,子類的構(gòu)造函數(shù)先調(diào)用基類的默認(rèn)構(gòu)造函數(shù)广料,然后才執(zhí)行自己。

Rectangle::Rectangle(...): Shape() {...} // Shape() 是編譯器附加的代碼

析構(gòu)函數(shù)是由外而內(nèi)幼驶,子類的析構(gòu)函數(shù)首先執(zhí)行自己艾杏,然后才調(diào)用基類的析構(gòu)函數(shù)。

Rectangle::~Rectangle(...) { ... ~Shape() } // ~Shape() 是編譯器附加的代碼

base class 的 析構(gòu)函數(shù)必須寫(xiě)成virtual盅藻,否則在以下情況會(huì)出現(xiàn)部分析構(gòu)的情況(表現(xiàn)為 undifined behavior)购桑。

Shape* ps = new Rectangle();
delete ps; // 這種情況下如果基類的析構(gòu)函數(shù)不是virtual,只能執(zhí)行基類的析構(gòu)函數(shù)氏淑,而子類的部分不能析構(gòu)勃蜘。

繼承中的虛函數(shù):

  1. non-virtual 函數(shù): 不希望子類重寫(xiě)(override)
  2. virtual 函數(shù): 希望派生類重寫(xiě)它,如果派生類沒(méi)有重寫(xiě)假残,可以使用基類的默認(rèn)定義版本
  3. pure-virtual 函數(shù): 派生類一定要重新定義缭贡。 定義了純虛函數(shù)則該類被認(rèn)為為抽象類。

Composition (復(fù)合)

復(fù)合是一種表示 'has-a' 的關(guān)系辉懒。一個(gè)類中包含了另一個(gè)類的實(shí)例阳惹。

class StringRep;
class String {
public:
    String();
    String(const String&s)
    String &operator=(const Stirng&s);
    ~String();
private:
    StringRep rep;
};

復(fù)合方式的構(gòu)造函數(shù)由內(nèi)而外,Container的構(gòu)造函數(shù)首先調(diào)用Component的defaul構(gòu)造函數(shù)耗帕,然后才執(zhí)行自己穆端。

Container::Container(...):Component() {...};

析構(gòu)的時(shí)候是由外而內(nèi),Container的析構(gòu)函數(shù)首先執(zhí)行自己仿便,然后才調(diào)用Component的析構(gòu)函數(shù)。

Container::~Container(...) {... ~Component() };

Delegation (委托)

委托 是一種以指針?lè)绞降膹?fù)合攒巍。一個(gè)類中包含了另一個(gè)類的指針嗽仪。

class StringRep;
class String {
public:
    String();
    String(const String&s)
    String &operator=(const Stirng&s);
    ~String();
private:
    StringRep* rep;
};

面向?qū)ο蟮脑O(shè)計(jì)模式 (Object Oriented Design)

Template Method

模版方法 是預(yù)先定義好操作的骨架,預(yù)留一些步驟的實(shí)現(xiàn)給子類柒莉。
C++ 中繼承中的虛函數(shù)即可完成這樣的功能闻坚。

CDocument::OnFileOpen()
{
...
Serialize();
...
}

class CMyDoc:public CDocumment
{
virtual Serialize() {...}
}

Observer

觀察者模式,是定義一種一對(duì)多的依賴關(guān)系兢孝,當(dāng)這這其中的一個(gè)改變時(shí)窿凤,所有其它依賴的對(duì)象都能自動(dòng)的被通知和更新仅偎。

在C++ 中可以使用 Delegation+Inheritance 實(shí)現(xiàn)。

class Subject
{
    int m_value;
    vector<Observer*> m_views;
public:
    void attach(Observer* obs)
    {
        m_views.push_back(obs);
    }
    void set_val(int value)
    {
        m_value = value;
        notify();   
    }
    void notify()
    {
        for(int i = 0; i < m_views.size(); ++i)
        {
            m_views[i]->update(this, m_value);
        }
    }
        
};

class Observer
{
public:
    virtual void update(Subject* sub, int value) = 0;
};

class Observer1: public Observer
{
    void update(int v)
    {
    ...
    }
};
class Observer2: public Observer
{
    void update(int v)
    {
    ...
    }
};

Composite

Composite的典型例子就是文件系統(tǒng)雳殊。文件系統(tǒng)由目錄和文件組成橘沥。每個(gè)目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件夯秃,也可以是目錄座咆。按照這種方式,計(jì)算機(jī)的文件系統(tǒng)就是以遞歸結(jié)構(gòu)來(lái)組織的仓洼。如果你想要描述這樣的數(shù)據(jù)結(jié)構(gòu)介陶,那么你可以使用組合模式Composite。
C++ 中可以通過(guò) Delegation+I(xiàn)nheritance 實(shí)現(xiàn)

class Componet
{
    int value;
public:
    Componet(int val) {value = val;}
    virtual void add(Component*) {}
};

class Composite:public Component
{
    vector<Component*> c;
public:
    Composite(int val):Component(val) {}
    
    void add(Component* elem) {
        c.push_back(elem);
    }
};

class Leaf:public Component
{
public:
    Leaf(int val):Component(val) {}
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末色建,一起剝皮案震驚了整個(gè)濱河市哺呜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箕戳,老刑警劉巖弦牡,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漂羊,居然都是意外死亡驾锰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門走越,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)椭豫,“玉大人,你說(shuō)我怎么就攤上這事旨指∩退郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵谆构,是天一觀的道長(zhǎng)裸扶。 經(jīng)常有香客問(wèn)我,道長(zhǎng)搬素,這世上最難降的妖魔是什么呵晨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮熬尺,結(jié)果婚禮上摸屠,老公的妹妹穿的比我還像新娘。我一直安慰自己粱哼,他們只是感情好季二,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般胯舷。 火紅的嫁衣襯著肌膚如雪刻蚯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天桑嘶,我揣著相機(jī)與錄音炊汹,去河邊找鬼。 笑死不翩,一個(gè)胖子當(dāng)著我的面吹牛兵扬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播口蝠,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼器钟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了妙蔗?” 一聲冷哼從身側(cè)響起傲霸,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眉反,沒(méi)想到半個(gè)月后昙啄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寸五,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年梳凛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梳杏。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡韧拒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出十性,到底是詐尸還是另有隱情叛溢,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布劲适,位于F島的核電站楷掉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霞势。R本人自食惡果不足惜烹植,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望支示。 院中可真熱鬧刊橘,春花似錦、人聲如沸颂鸿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嘴纺。三九已至败晴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栽渴,已是汗流浹背尖坤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闲擦,地道東北人慢味。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像墅冷,于是被迫代替她去往敵國(guó)和親纯路。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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