GeekBand筆記: C++面向?qū)ο蟾呒?jí)編程(3)

OOD(Object Oritented Design)

  • Inheritance 繼承
    • 表示 is-a
    • public, private, protected Inheritance
    • 子類(lèi)繼承父類(lèi)的所有數(shù)據(jù)成員
    • 子類(lèi)對(duì)函數(shù)繼承是繼承調(diào)用權(quán)
  • Composition 復(fù)合/組合
    • 表示 has-a
  • Delegation 委托
    • Composition by reference 也稱(chēng)為引用復(fù)合/組合(不是真正的has-a,而是has-a-pointer which point to a object)
      • 實(shí)際上component是指針抛计,但約定俗成稱(chēng)為引用復(fù)合吹截。component指針指向另一個(gè)類(lèi),需要的時(shí)候可以通過(guò)指針調(diào)用(委托)另一個(gè)類(lèi)
    • Handle/Body晨逝。Handle是接口懦铺,Body是實(shí)現(xiàn)。這是一種松耦合的思想
    • pimpl(pointer to implication)
    • reference counting 就是一種Delegation的實(shí)現(xiàn)昏翰。另外,當(dāng)一個(gè)對(duì)象想通過(guò)reference改變指向的對(duì)象時(shí)浸踩,就需要實(shí)現(xiàn)copy-on-write(寫(xiě)時(shí)復(fù)制)

UML關(guān)系圖

+ public
- private
# private
_ static

Inheritance with virtual functions

  • non-virtual function:不希望derived class overwrite

  • virtual function

    • 希望derived class overwrite检碗。
    • 已有默認(rèn)定義码邻。
  • pure virtual function

    • 一定要 derived class overwrite。
    • 沒(méi)有默認(rèn)定義怕犁。(其實(shí)可以有定義)
class Shape {
public:
        virtual void draw() const = 0;
        virtual void error(const std::string& msg);
        int objectID() const;
};

Inheritance, Composition的構(gòu)造和析構(gòu)順序

  • Inheritance

    • 構(gòu)造由內(nèi)到外:super class constructor ==> derived class constructor
    • 析構(gòu)由外到內(nèi):derived class destructor ==> super class destructor
      • super class destructor must be virtual, otherwise occurs undefined behavior
  • Composition

    • 構(gòu)造由內(nèi)到外:component default constructor ==> derived class constructor
    • 析構(gòu)由外而內(nèi):derived class destructor ==> component destructor
  • Inheritance + Composition

    • 構(gòu)造由內(nèi)到外奏甫,先父類(lèi)再組合:super class constructor ==> component default constructor ==> derived class constructor
    • 析構(gòu)由外到內(nèi)凌受,先組合在父類(lèi):derived class destructor ==> component destructor ==> super class destructor

Inheritance,Composition,Delegation 和設(shè)計(jì)模式

Template Method 模板方法/函數(shù)

  • Inheritance with virtual functions 的實(shí)現(xiàn)胜蛉,晚綁定
  • MFC, 通過(guò)Template Method思想實(shí)現(xiàn)的Application Framework

Adapter 適配器模式

Composition的實(shí)現(xiàn)

Observer 觀察者模式

Delegation + Inheritance

Composite 組合模式

Delegation + Inheritance

Prototype

Delegation + Inheritance
現(xiàn)在要?jiǎng)?chuàng)建未來(lái)的class對(duì)象,使得Prototype能看到新創(chuàng)建的對(duì)象

類(lèi)型轉(zhuǎn)換與繼承

派生類(lèi)向基類(lèi)的類(lèi)型轉(zhuǎn)換

  • 從派生類(lèi)到基類(lèi)的類(lèi)型轉(zhuǎn)換只對(duì)指針或者引用類(lèi)型有效
Quote item;       // 基類(lèi)對(duì)象
Bulk_quote bulk;  // 派生類(lèi)對(duì)象
Quote *p = &item; // p指向Quote對(duì)象
p = &bulk;       // p指向bulk的Quote部分
Quote &r = bulk; // r綁定到bulk的Quote部分
  • (非指針或引用)派生類(lèi)對(duì)象也可以拷貝领突、移動(dòng)或者賦值給一個(gè)基類(lèi)對(duì)象案怯。但由于是調(diào)用基類(lèi)的拷貝控制成員殴泰,所以只能處理派生類(lèi)的基類(lèi)部分浮驳,派生部分會(huì)被切掉(sliced down)
Bulk_quote bulk;  // 派生類(lèi)對(duì)象
Quote item(bulk); // 使用Quote::Quote(const Quote&)構(gòu)造函數(shù)
item = bulk; // 使用Quote::operator=(const Quote&)賦值操作符
  • 不存在基類(lèi)向派生類(lèi)的隱式轉(zhuǎn)換
Bulk_quote bulk;  // 派生類(lèi)對(duì)象
Quote *itemP = &bulk; // itemP的動(dòng)態(tài)類(lèi)型是Bulk_quote
// 即使itemP指針綁定的動(dòng)態(tài)類(lèi)型是Bulk_quote(派生類(lèi))至会,但itemP的靜態(tài)類(lèi)型是Quote(基類(lèi))
// 編譯器只能通過(guò)檢查指針或引用的靜態(tài)類(lèi)型來(lái)判斷該轉(zhuǎn)換是否合法
Bulk_quote *bulkP = itemP; // 錯(cuò)誤,不能將基類(lèi)轉(zhuǎn)換成派生類(lèi)

靜態(tài)類(lèi)型 vs. 動(dòng)態(tài)類(lèi)型

  • 存在條件

    • 當(dāng)使用存在繼承關(guān)系的類(lèi)型時(shí)
    • 且當(dāng)變量或者表達(dá)式是引用或指針時(shí)
    • 存在靜態(tài)類(lèi)型(static type)和動(dòng)態(tài)類(lèi)型(dynamic type)
  • 靜態(tài)類(lèi)型是在編譯時(shí)已知的宵蛀,是變量聲明的類(lèi)型

  • 動(dòng)態(tài)類(lèi)型是在運(yùn)行時(shí)才可知的,是表示內(nèi)存中的對(duì)象的類(lèi)型

動(dòng)態(tài)綁定(dynamic binding/ run-time binding)凑懂, 多態(tài)性梧宫, 虛函數(shù),虛函數(shù)表

  • 動(dòng)態(tài)綁定:函數(shù)運(yùn)行時(shí)選擇函數(shù)版本

    • 和overload區(qū)分脓豪。overload是指同一個(gè)類(lèi)里扫夜,同名函數(shù)通過(guò)參數(shù)不同來(lái)確定調(diào)用哪個(gè)函數(shù)驰徊。注意和返回值無(wú)關(guān),和繼承無(wú)關(guān)望侈,和virtual無(wú)關(guān)
  • 當(dāng)且僅當(dāng) 基類(lèi)通過(guò)指針或者引用指向派生類(lèi)類(lèi)型勋桶,且調(diào)用的是虛函數(shù)時(shí)例驹,才能實(shí)現(xiàn)動(dòng)態(tài)綁定(會(huì)在運(yùn)行時(shí)解析該調(diào)用)。但這時(shí)還不算實(shí)現(xiàn)了多態(tài)性鹃锈,還需要派生類(lèi)重寫(xiě)override了虛函數(shù)屎债,這是才會(huì)調(diào)用動(dòng)態(tài)類(lèi)型的虛函數(shù),實(shí)現(xiàn)多態(tài)性

    • 不滿(mǎn)足以上的任何一個(gè)條件盆驹,都無(wú)法實(shí)現(xiàn)動(dòng)態(tài)綁定(多態(tài)性)躯喇,調(diào)用的都是本身的函數(shù)(編譯時(shí)綁定的函數(shù))
    • 調(diào)用非虛函數(shù)硝枉,普通對(duì)象調(diào)用函數(shù)都是在編譯時(shí)綁定了調(diào)用函數(shù)的版本倦微。
  • 多態(tài)性:父類(lèi)的指針有“多種形態(tài)”欣福。簡(jiǎn)而言之就是用父類(lèi)的指針指向其子類(lèi)的實(shí)例,然后通過(guò)父類(lèi)的指針調(diào)用實(shí)際子類(lèi)的成員函數(shù)

  • 虛函數(shù)的作用主要是實(shí)現(xiàn)了多態(tài)的機(jī)制

    • 虛函數(shù)(Virtual Function)是通過(guò)一張?zhí)摵瘮?shù)表(Virtual Table)來(lái)實(shí)現(xiàn)的

顯式類(lèi)型轉(zhuǎn)換

C++風(fēng)格的類(lèi)型轉(zhuǎn)換提供了4種類(lèi)型轉(zhuǎn)換操作符來(lái)應(yīng)對(duì)不同場(chǎng)合的應(yīng)用
cast-name<type>(expression)

  • const_cast
    • 去const屬性
  • dynamic_cast
    • 轉(zhuǎn)換的安全檢查將在運(yùn)行時(shí)執(zhí)行
    • 多態(tài)類(lèi)之間的類(lèi)型轉(zhuǎn)換用daynamic_cast
  • static_cast
    • 類(lèi)似于C風(fēng)格的強(qiáng)制轉(zhuǎn)換棕诵。無(wú)條件轉(zhuǎn)換
    • 強(qiáng)制覆蓋編譯器的檢查工作
    • 基本類(lèi)型轉(zhuǎn)換用static_cast
  • reinterpret_cast
    • 不同類(lèi)型的指針類(lèi)型轉(zhuǎn)換用reinterpret_cast
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末校套,一起剝皮案震驚了整個(gè)濱河市牧抵,隨后出現(xiàn)的幾起案子笛匙,更是在濱河造成了極大的恐慌,老刑警劉巖犀变,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妹孙,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡获枝,警方通過(guò)查閱死者的電腦和手機(jī)蠢正,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)省店,“玉大人嚣崭,你說(shuō)我怎么就攤上這事∨嘲” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵粗俱,是天一觀的道長(zhǎng)说榆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)寸认,這世上最難降的妖魔是什么签财? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮偏塞,結(jié)果婚禮上唱蒸,老公的妹妹穿的比我還像新娘。我一直安慰自己烛愧,他們只是感情好油宜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著怜姿,像睡著了一般慎冤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沧卢,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天蚁堤,我揣著相機(jī)與錄音,去河邊找鬼但狭。 笑死披诗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的立磁。 我是一名探鬼主播呈队,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼唱歧!你這毒婦竟也來(lái)了宪摧?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤颅崩,失蹤者是張志新(化名)和其女友劉穎几于,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體沿后,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沿彭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尖滚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喉刘。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖漆弄,靈堂內(nèi)的尸體忽然破棺而出饱搏,到底是詐尸還是另有隱情,我是刑警寧澤置逻,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布推沸,位于F島的核電站,受9級(jí)特大地震影響券坞,放射性物質(zhì)發(fā)生泄漏鬓催。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一恨锚、第九天 我趴在偏房一處隱蔽的房頂上張望宇驾。 院中可真熱鬧,春花似錦猴伶、人聲如沸课舍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筝尾。三九已至捡需,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筹淫,已是汗流浹背站辉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留损姜,地道東北人饰剥。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像摧阅,于是被迫代替她去往敵國(guó)和親汰蓉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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