EffectiveC 學習筆記 條款34 35

2021-08-03 19:13:18 字數 1899 閱讀 8796

條款34 區分介面繼承和實現繼承

條款35 考慮virtual函式以外的選擇

在設計類成員函式時,一般既不要將所有函式都宣告為non-virtual(普通函式),這會使得沒有餘裕空間進行特化工作;也一般不要將所有函式都宣告為virtual(虛函式或純虛函式),因為一般會有一些成員函式是基類就可以決定下來的,而被所有派生類所共用的。這個設計法則並不絕對,要視實際情況來定。

總結

介面繼承和實現繼承不同。在public繼承之下,derived class總是繼承base class的介面;

pure virtual函式只具體指定介面繼承;

impure virtual函式具體指定介面繼承和預設實現繼承;

non-virutal函式具體指定介面繼承以及強制性實現繼承。

使用non-virtual inte***ce的方式實現template method模式

直接上**:

class base

//列印結果

base::work

derived do work

使用function pointers的方式實現strategy模式

例如在設計乙個遊戲角色的健康成長設定的時候。我們可以直接指向乙個健康計算函式,可直接呼叫函式進行計算

class gamecharacter;

//預設的健康計算 (正常人) 還可能有體力好的人 恢復健康就很快等等

int defaulthealthcalc(gamecharacter&);

class gamecharacter

//獲取乙個角色的健康值

int healthvalue() const

private:

healthcalcfunc m_hcf;

};

這樣使用函式指標的方式,彈性就更大了。

我們的子類可以繼承這個類:

class guy : public gamecharacter

...};//提供不同體質的人的計算方法

int losehealthquickly(const gamecharacter&);

int losehealthslowly(const gamecharacter&);

//可以建立不同體質的人

guy g1(losehealthquickly);

guy g2(losehealthslowly);

當然可以提供函式設定這個函式指標。

但是這樣還是有問題,當我們需要使用non-member函式訪問class的non-public成份的唯一方法就是弱化封裝。

使用tr1::function的方式實現strategy模式

使用函式指標的約束很明顯,必須是函式,固定的返回值與引數。但是tr1::function則沒有這些現實,這樣的物件可持有任何可呼叫物(函式指標、函式物件、成員函式指標),只要宣告格式相容與需求。

只需要將上面類的函式指標宣告替換成:

typedef std::tr1:;function

healthcalcfunc;

舉個簡單例子:

void func(string str)//帶呼叫的函式

//列印結果

func:hello

func:operator:world

常見的strategy模式

這個想必都很熟悉了,實現比較簡單,但是呢始終不如tr1::funtion和tr1::bind酷。。。

Effective C 學習筆記

學習effective c 已經有相當長的一段時間了,今天抽出時間又堵了一遍第一部分 c語言 c 以c語言為基礎,幾乎支援所有的c語言成分,例如區塊 語句 預處理 內建資料型別 陣列 指標等,c語言的侷限是 沒有模板 沒有異常 沒有過載 物件導向的c 也就是加上了物件特性的c,類 封裝 繼承 多型 ...

Effective C 學習筆記

1 c 是乙個複合式的語言 c 中不同部分有著不同的語言特性,例如 1.1 在c中傳遞形參時,按照值傳遞比按照指標傳遞效率更高 1.2 在物件導向程式中,物件要按照const引用而不是按照值傳遞 1.3 在stl程式設計中採取按照值傳遞方式 所以說c 中沒有統一的準則,要按照不同的特性採取不同的使用...

effective c 學習筆記

如果不考慮應用程式的使用場合,僅僅考慮語言的靈活性,我贊成作者的想法。但是不同的應用它會有不同的效能要求,所以語言的選擇,應該是用 最適合 條款去選擇。使用巨集定義常量,若定義在標頭檔案中,則所有包含標頭檔案的都可以使用。巨集定義,在預處理的時候進行替換。巨集定義一些簡單的函式,可以減少呼叫開銷,但...