Effective C 學習筆記(6)

2021-07-02 20:54:50 字數 667 閱讀 7545

term 09: never call virtual functions during construction or destruction.

不要在建構函式和析構函式內直接或間接呼叫虛函式,這時的虛函式不具備多型特性。存在一種場景,我們希望在基類的建構函式中針對不同的派生類實現有區別的構造。但如果在這裡呼叫虛函式,那麼派生類的物件在構造的時候先呼叫了這個基類的建構函式。由於派生類的建構函式並沒有呼叫,因此呼叫派生類的方法存在著使用未初始化的派生類成員變數的危險。對於編譯器而言,這種情況是不可接受的,因此選擇在建構函式內將虛函式靜態鏈結,不承認其動態特性。因此,在建構函式內呼叫的虛函式都不是真正的虛函式。

對於析構函式而言,有類似的情況。基類的析構函式呼叫時派生類的析構已經呼叫過,成員已銷毀,因此呼叫的虛函式也不是真正的虛函式。

如果依然堅持想要在基類建構函式內針對不同的派生類物件執行不同的邏輯,可以由派生類建構函式傳遞不同的引數給基類的建構函式,從而基類可以根據不同的派生類建構函式執行不同的邏輯。如下:

class cbase

;cbase::cbase(int nid)

};class cderived1: public cbase

;class cderived2: public cbase

;

Effective C 學習筆記 (6)

其實本條款講的比較簡潔,由於條款5說明了 預設建構函式 拷貝建構函式 複製運算子 這三個雖然使用者不自己定義,但是用到的時候編譯器還是會為它們生成 所以就導致了一些情況下,使用者不想提供拷貝建構函式,但是編譯器預設生成了,解決這類問題主要經過了如下幾步。1 將拷貝建構函式生命為private的,這樣...

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 中沒有統一的準則,要按照不同的特性採取不同的使用...