第十三章 - 類繼承 - 1/1

0、本章內容:

is-a關係的繼承。

如何以公有方式從一個類派生出另一個類。

保護訪問。

構造函數成員初始化列表。

向上和向下強制轉換。

虛成員函數。

早期(靜態)聯編與晚期(動態)聯編。

抽象基類。

純虛函數。

何時及如何使用公有繼承。

1、一個簡單的基類:

1.1 派生一個類

存儲了基類的數據成員。
可以使用基類方法。

需要自己的構造函數。
可以根據需要添加額外的數據成員和成員函數。

1.2 構造函數:訪問權限的考慮

派生類構造函數必須使用基類構造函數。
用成員初始化列表,沒有則用默認構造函數。

1.3 使用派生類

1.4 派生類和基類之間的特殊關係

派生類可以使用基類方法。
基類指針可以指向派生類對象,基類引用可以引用派生類對象。

派生類可以初始化基類,可以賦值給基類。
使用隱式複製構造函數、隱式重載賦值運算符函數。

2、繼承:is-a關係:

不能刪除基類屬性。

3、多態公有繼承:

3.1 開發Brass類和BrassPlus類

基類和派生類,都帶virtual使用對象的類型,都不帶virtual使用指針或引用的類型。
基類使用virtual,派生類默認帶virtual,使用對象的類型。
基類不使用virtual,派生類使用virtual,使用指針或引用的類型。

爲基類聲明一個虛析構函數也是一個慣例。

只有構造函數才能使用成員初始化列表。

4、靜態聯編和動態聯編:

4.1 指針和引用類型的兼容性

使用基類引用或指針作爲參數的函數調用,將進行向上轉換。

4.2 虛成員函數和動態聯編

編譯器對非虛方法使用靜態聯編,對虛方法使用動態聯編。
如果需要在派生類中重新定義基類的方法,則將它設置爲虛方法,否則設置爲非虛方法。

4.3 有關虛函數的注意事項

構造函數不能是虛函數,創建派生類對象應該調用派生類的構造函數。
析構函數應當是虛函數,即使這個類不用作基類。
友元函數不能是虛函數,因爲只有成員函數才能使虛函數。

重新定義繼承的方法不是重載,而是隱藏。
如果返回的是基類引用或指針,則可以修改爲指向派生類的引用或指針(返回類型協變)。

5、訪問控制:protected:

派生類可以訪問基類的protected成員。

6、抽象基類:

純虛函數 = 抽象函數 + 虛函數。
包含純虛函數的類只能用作基類。

6.1 應用ABC概念

6.2 ABC理念

7、繼承和動態內存分配:

7.1 第一種情況:派生類不使用new

不需要定義顯式析構函數、複製構造函數和賦值運算符。

7.2 第二種情況:派生類使用new

需要定義顯式析構函數、複製構造函數和賦值運算符。
對於基類元素,顯式析構函數自動完成,複製構造函數用成員初始化列表,賦值運算符顯式調用基類賦值運算符。

7.3 使用動態內存分配和友元的繼承分配示例

派生類使用<<需要強制類型轉換來使用基類的<<。

8、類設計回顧:

8.1 編譯器生成的成員函數
默認構造函數、複製構造函數、賦值運算符。

8.2 其他的類方法
構造函數、析構函數、轉換、按值傳遞對象與傳遞引用、返回對象和返回引用使用const。

8.3 共有繼承的考慮因素
什麼不能被繼承?構造函數、析構函數、賦值運算符、友元函數、靜態函數。

8.4 類函數小結

9、總結:

null。

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