C++ primer 第十五章

1.      動態綁定使編譯器能夠在運行時決定使用在基類中定義的函數還是在派生類中定義的函數。

2.      定義爲virtual的函數是基類希望派生類重定義的,基類希望派生類繼承的函數不能定義爲虛函數。

除了構造函數外,任意非static成員函數都可以是虛函數。virtual只在類內部的成員函數聲明處出現,不能用在類定義體外部出現的函數定義中。

如果幾類定義了static成員,則整個繼承層次中只有一個這樣的成員。無論從基類派生出多少個派生類,每個static成員只有一個實例。

Static成員遵循常規訪問控制:如果成員在基類爲private,則派生類不能訪問它。如果不是private,則既可以通過基類訪問,也可以通過派生類訪問。

3.      通過基類的引用、指針調用虛函數時,發生動態綁定。

4.      protected成員可以被派生類對象訪問,但不能被基類的普通用戶訪問。

5.      類派生列表:這裏access-label是public、protected或private。派生類可以進一步限制但不能放鬆對所繼承的成員的訪問。

如果是public繼承,則基類成員保持自己的訪問級別,基類的public成員爲派生類的public成員,基類的protected成員爲派生類的protected成員。

如果是protected繼承,基類的public和protected成員在派生類中爲protected成員。

如果是private繼承,基類所有成員在派生類中爲private成員。

6.      派生類中虛函數的聲明必須與基類中的定義方式完全匹配。但有一個例外:返回對基類類型引用的虛函數,在派生類中可以返回對派生類型的引用。

7.      如果希望覆蓋虛函數機制並強制調用虛函數的特定版本,可以使用作用域操作符。

8.      使用class保留字定義的派生類默認具有private繼承,而用struct保留字定義的類默認具有public繼承。

9.      友元可以訪問類的private和protected數據。友元關係不能繼承,基類的友元對派生類的成員沒有特殊訪問權限。如果基類被授予友元關係,則只有基類具有特殊訪問權限,該積累的派生類不能訪問授予友元關係的類。

10.  如果將派生類型的對象傳給希望接受【基類引用】的函數,引用將直接綁定到該對象,對象本身未被複制,實際上實參是該對象的引用。

將派生類對象傳給希望接受基類類型對象的函數時,情況不同,會將派生類類型對象的基類部分複製到形參,構造一個基類類型對象。

11.  如果是public繼承,用戶代碼和後代類都可以使用派生類到基類的轉換。如果是使用private或protected繼承,則用戶代碼不能將派生類類型對象轉換爲基類對象。

12.  構造函數和複製控制成員不能繼承,每個類定義自己的構造函數和複製控制成員。

如果想要構造只希望派生類使用的構造函數,可將該構造函數定義爲protected。

13.  派生類的合成默認構造函數的基類部分由基類的默認構造函數初始化,派生類部分由各成員的默認構造函數構造。

派生類構造函數的初始化列表只能初始化派生類成員,不能直接初始化繼承成員,可將基類包含在構造函數初始化列表中來間接初始化繼承成員。

派生類應通過使用基類構造函數尊重基類的初始化意圖,而不是在派生類構造函數體中對這些成員賦值。

14.  如果派生類顯式定義自己的複製構造函數或賦值操作符,則基類的複製構造函數和賦值操作符負責對基類成分以及派生類自己的成員進行復制或賦值。

15.  派生類析構函數不負責撤銷基類對象的成員,而是顯示調用基類的析構函數,每個析構函數只負責清除自己的成員。

16.  構造函數不能定義爲虛函數,構造函數是在對象完全構造之前運行的,此時對象的動態類型還不完整。

17.  在基類和派生類中使用同一名字的成員函數,與數據成員一樣,在派生類作用域中派生類成員將屏蔽基類成員,即使函數原型不同。

18.  派生類不用重定義所繼承的每一個基類版本,它可以爲重載成員提供using聲明。一個using聲明只能指定一個名字,不能指定形參表。因此,爲基類成員函數名稱而作的using聲明,將把該函數的所有重載實例加到派生類的作用域。

19.  純虛函數:在函數形參表後面寫上=0以指定純虛函數。純虛函數說明,該函數爲後代類型提供了可覆蓋的接口,但是當前這個類的版本絕不會調用。

20.  基類通常也應定義一個虛析構函數。如果經常會在指向基類的指針實際指向派生類對象時刪除它,析構函數就必須爲虛函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章