GeekBandC++開發(fā)工程師第三周學習筆記

類與類之間有三大關系:繼承(Inheritance)扣墩、復合(Composition)和委托(Delegation)

3.1.1 復合(Composition)

template <class T, class Sequence = deque <T> >

class queue {

? . . .

protected:

? ? ?Sequence c;

public:

? ? ? bool empty() const { return c.empty(); }

? ? ? size_type size() const? { return s.size(); }

? ? ? reference front() { return c.front(); }

? ? ? reference back() { return c.back(); }

? ? ? void push(const value_type& x) {c.push_back(x);}

? ? ? void pop() { c.pop_front(); }

};

3.1.2(Adapter:)改造

//No:1

template?

class?queue{

...

protected?c;//擁有模塊2

...

};

//No:2

template?

class?queue{

protected:

Itr?strat;//擁有模塊3绍弟,sizeof:16

Itr?finish;

T**?map;//指針的指針赚哗,4個字節(jié)

unsigned?int?map_size;//4個字節(jié)

};

//No:3

template?

struct?Itr{

T*?cur;//sizeof:4*4

T*?first;

T* last;

T**?node;

...

};

3.1.3復合關系下的構造函數(shù)和析構函數(shù):

構造由內而外:Container::Component(...): Component() {...};

Container的構造函數(shù)首先調用Component的default構造然后才執(zhí)行自己

析構由外而內:Container :: ~Container(...) { ... ~Component() }

Container的析構函數(shù)首先執(zhí)行自己顷牌,然后才調用Component的析構函數(shù)

3.2 委托:兩個類之間相連

class?String{

public:

String();

~String();

String(const?char*s);

String(const?String&?a);

String?&operator=(const?String&?s);

private:

StringRep*?rep;//等到需要用到StringRep時才去創(chuàng)建StringRep類

};

class?StringRep{

friend?class?String;

StringRep(const?char*?s);

~StringRep();

int?count;

char*?rep;

}

3.3.1 繼承:

struct?_List_node_base

{

_List_node_base*?_M_next:

_List_node_base*?_M_prev;

};

template

struct?_List_node?:public?_List_node_base

{

_Tp ? _M_data;//它除了擁有自己的東西以外,還擁有基類的兩個東西

};

3.3.2基類的析構函數(shù)必須是virtual吟温,否則會出現(xiàn)undefined behavior

在繼承的情況下翎碑,構造由內而外:Derived::Derived(...) : Base() {...};

Derived的構造函數(shù)首先調用基類的默認構造函數(shù)槽唾,然后才執(zhí)行自己

析構由外而內:Derived的析構函數(shù)首先執(zhí)行自己,然后才調用基類的析構函數(shù)

Derived::~Derived(...){... ~Base() }光涂;

3.3.3

non-virtual函數(shù):你不希望derived class 重新定義它

virtual函數(shù):你希望derived class重新定義它庞萍,且它已有默認定義。

pure virtual函數(shù):你希望derived class一定要重新定義它忘闻,你對他沒有默認定義钝计。

3.4?純虛函數(shù):virtual 函數(shù)類型 函數(shù)名(參數(shù)表)=0;

聲明為純虛函數(shù)后齐佳,基類中就不再給出函數(shù)的實現(xiàn)部分私恬,且純虛函數(shù)不具備函數(shù)的功能,不能被調用炼吴。

作用:在基類中為其派生類保留一個函數(shù)的名字本鸣。以便派生類根據(jù)需要對它進行重載

3.5. ?inheritance+Composition關系下的構造和析構:

派生類中有基類的part,但派生類中又有Component,這時硅蹦,調用順序是基類=Component.>派生類

派生類中有基類的part荣德,而基類part中又有Component時,這時調用順序為:Component>基類>派生類童芹,析構函數(shù)正好相反

委托+繼承:

class?Subject{

int?m_value;

vector?m_views;//容器里的類型為Observe*

public:

void?attach(Observe*?obs)

m_views.push_back(obs);

void?set_val(int?value)

{

m_value?=?value;

motify();

}

void?notify()

{

for(int?i=0;i

m_views[i]->update(this,m_value);

}

};

class?Observe{

public:

virtual?void?update(Subject*?sub,int?value)const?=0;

};

委托+繼承:

容器里面的東西一定要放一樣的大小涮瞻,指針是最優(yōu)選

變量名:partname

#nclude

enum?imageType{LAST,SPOT};//枚舉

class?Image{

public:

virtual?void?draw()=0;

static?Image*?findAndClone(imageType);

protected:

virtual?imageType?return?Type()=0;

virtual?Image*?clone()?=0;//要求子類必須對其進行編譯

static?void?assProtype(Image?*image)//靜態(tài)成員函數(shù)

{

_prototypes[_nextSlot++]

}

private:

static?Image*?__prototypes[10];

static?int?_nextSlot;//class當中的靜態(tài)date,一定要在這個類外做一次定義辐脖,分配內存

};

Image?*Image::_prototypes[];

int?Image::_nextSlot;

Image?*Image::findAndClone(imageType?type)

{//當下面所有的子類把自己的一份原型放上去之后填充的數(shù)組

for(int?i=0;i<_nextSlot;i++)

{

if(_prototypes[i]->()?==type)//找到一個原型之后饲宛,調用clone(),就做了一個副本

return?_prototypes[i]->clone;

}


public繼承和is-a之間的等價關系聽起來頗為簡單皆愉,但有時候會誤導人

企鵝是一種鳥嗜价,這是對的;鳥會飛幕庐,這也對的久锥。但企鵝會飛嗎?

class Bird{

public:

virtual void fly();//鳥會飛

...

};

class Penguin:public Bird{//企鵝是一種鳥

...

};

這個代碼但是是行得通的异剥,但是那不是真的瑟由。

上述例子中,有一個與事實不符的error冤寿。如果謹慎一點歹苦,應該是:有的鳥會飛,有點鳥不會飛督怜。來塑模出較佳的真實性:

class Bird{

public:

...//沒有聲明fly()函數(shù)

};

class FlyingBird:public Bird{

public:

? ? ? virtual void fly();//鳥會飛

? ? ? ?...

};

class Penguin:public Bird{//企鵝是一種鳥

...

};

這樣的繼承體系才能比原先的設計更能忠實反映出真正的意思殴瘦。

現(xiàn)在,如果非得要求企鵝會飛号杠,那編譯器會不滿:

Penguin p蚪腋;

p.fly();//錯誤

一個好的接口可以防止無效的代碼通過編譯丰歌,因此應該采取“在編譯期拒絕企鵝飛行”的設計,而不是“只在運行期間才能偵測它們”的設計屉凯。

所以立帖,is-a并不是唯一存在于類之間的關系。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末悠砚,一起剝皮案震驚了整個濱河市晓勇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌灌旧,老刑警劉巖宵蕉,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異节榜,居然都是意外死亡羡玛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門宗苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稼稿,“玉大人,你說我怎么就攤上這事讳窟∪眉撸” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵丽啡,是天一觀的道長谋右。 經(jīng)常有香客問我,道長补箍,這世上最難降的妖魔是什么改执? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮坑雅,結果婚禮上辈挂,老公的妹妹穿的比我還像新娘。我一直安慰自己裹粤,他們只是感情好终蒂,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遥诉,像睡著了一般拇泣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矮锈,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天霉翔,我揣著相機與錄音,去河邊找鬼愕难。 笑死早龟,一個胖子當著我的面吹牛惫霸,可吹牛的內容都是我干的。 我是一名探鬼主播葱弟,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼壹店,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芝加?” 一聲冷哼從身側響起硅卢,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎藏杖,沒想到半個月后将塑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蝌麸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年点寥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片来吩。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡敢辩,死狀恐怖,靈堂內的尸體忽然破棺而出弟疆,到底是詐尸還是另有隱情戚长,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布怠苔,位于F島的核電站同廉,受9級特大地震影響,放射性物質發(fā)生泄漏柑司。R本人自食惡果不足惜迫肖,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帜羊。 院中可真熱鬧咒程,春花似錦鸠天、人聲如沸讼育。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奶段。三九已至,卻和暖如春剥纷,著一層夾襖步出監(jiān)牢的瞬間痹籍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工晦鞋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蹲缠,地道東北人棺克。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像线定,于是被迫代替她去往敵國和親娜谊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容