1.1 什麼是繼承
在C++中,如果類C1通過繼承已有類C而建立,則將C1稱作衍生類別,將C稱作基類,衍生類別會繼承基類中定義的所有屬性和方法。
1.2 衍生類別的定義
定義衍生類別的文法為:
1 Class 衍生類別名:繼承方式 基類名
2 {
3 衍生類別成員說明;
4 };
其中,繼承方式包括public、protected、private三種。
1.3 函數重定義
對於基類中的函數,可以再衍生類別中對其重新定義、實現新的功能。
區別函數重定義和函數重載:
函數重載:要求函數形參不同,在實際調用時根據傳入的實參來決定執行哪個函數。
函數重定義:要求衍生類別中的函數原型與基類中的函數原型一樣,在實際調用時根據物件類型來決定調用基類中定義的函數還是衍生類別中重定義的函數。
1.4 衍生類別的繼承方式
繼承方式包括public、protected、private三種,總結如下:
繼承方式 訪問方式 |
public |
private |
protected |
public |
public |
不可訪問 |
protected |
private |
private |
不可訪問 |
private |
protected |
protected |
不可訪問 |
protected |
1.5 衍生類別的建構函式與解構函式
衍生類別建構函式的作用主要是對衍生類別中新添加的資料成員做初始化工作。同樣,衍生類別解構函式的作用主要是清除衍生類別中新添加的資料成員,釋放它們所佔據的系統資源。
1.5.1建構函式和解構函式的定義
衍生類別中建構函式的定義形式有如下兩種:
(1)形式1
1 衍生類別名(形參列表):基類名(實參列表)
2 {
3 //衍生類別中資料成員的初始化
4 }
(2)形式2
1 衍生類別名(形參列表)
2 {
3 //衍生類別中資料成員的初始化
4 }
衍生類別中解構函式的定義形式與基類完全相同,如下:
1 ~衍生類別名()
2 {
3 //釋放衍生類別中資料成員所佔據的系統資源
4 }
1.5.2 建構函式和解構函式的調用順序
當建立衍生類別對象時,先調用基類的建構函式,再調用衍生類別的建構函式;解構函式調用順序總是與建構函式調用順序相反。
1.6 類型相容(這個有點繞,需要好好理解下)
類型相容是指在基類對象可以出現的任何地方,都可以用共有衍生類別的對象來代替。類型相容所指的是如下三種情況:
(1)衍生類別對象可以賦值給基類對象;
(2)衍生類別對象可以初始化基類的引用;
(3)基類指標可以指向衍生類別對象。
注意:用衍生類別對象替代基類對象進行賦值操作後,通過基類對象、基類對象引用和基類指標只能訪問基類成員。
雖然用衍生類別代替了基類之後,就可以把衍生類別對象當做基類對象使用,但是只能訪問基類成員。
1.7 多重繼承
1.7.1 多重繼承的文法
在一個多重繼承關係中,定義衍生類別的文法為:
1 Class 衍生類別名:繼承方式 基類名1,繼承方式 基類名2,...,繼承方式 基類名n
2 {
3 衍生類別成員聲明;
4 };
其中,基類名的順序決定了建構函式的順序。
1.7.2 二義性問題和虛基類
二義性問題:多個基類如果存在相同的成員,就會帶來二義性問題。衍生類別對象不知道應該訪問哪個基類的成員。
解決二義性問題的步驟為:
(1)為多重繼承關係中具有相同成員的兩個基類C1和C2定義一個共同的基類C,基類C中包括C1和C2中相同的成員,同時將這些相同的成員從C1和C2中刪除。
(2)C1和C2都作為C類的衍生類別,在C1和C、C2和C這兩個繼承關係中將C聲明為虛擬繼承方式,此時C類被稱為虛基類。
虛擬繼承的文法為:
1 class 衍生類別名:virtual 繼承方式 虛基類名
2 {
3 ...
4 }
好了,今天的學習就到這裡了。
...
參考:
物件導向程式設計----C++進階語言 主編 趙宏