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。