標籤:
類的繼承與派生
物件導向技術強調軟體的可重用性,這種重用性通過繼承機制來實現。而在類的繼承過程中,被重用的原有類稱為基類,新建立的類稱為衍生類別。衍生類別定義文法格式如下:
class <衍生類別名> : <繼承方式> <基類名1>, <繼承方式> <基類名2> ......
{
<衍生類別成員的定義>;
}
繼承方式控制著衍生類別成員以及衍生類別對象如何訪問從基類繼承來的成員;“:”後只有一個基類為單繼承,有多個基類為多繼承。
衍生類別的建構函式和解構函式
由於基類的建構函式和解構函式不能被繼承,在衍生類別中,如果對衍生類別新增的成員進行初始化,就必須為衍生類別添加新的建構函式。
建構函式
衍生類別從基類繼承了非私人成員函數和資料成員,但在建立衍生類別對象時,系統執行衍生類別的建構函式,而不會自動執行基類的建構函式。如果基類的建構函式包含對基類資料的初始化,那麼在設計衍生類別的建構函式時,還應為初始化基類資料成員提供參數,所有這些參數在衍生類別的建構函式中都以初始化列表的形式提供,文法格式如下:
<衍生類別名>(<形參表>) : <基類名1>(<形參表1>), <基類名2>(<形參表2>) ......
{
<衍生類別新增資料成員的初始化>;
}
在建立衍生類別對象時,系統是使用衍生類別的建構函式參數表所提供的參數,首先去調用基類的建構函式。
解構函式
在執行衍生類別的解構函式時,基類的解構函式也將被自動調用,它們的順序恰好與衍生類別的建構函式的調用順序相反,先衍生類別的解構函式,後基類的解構函式。
虛基類
多重繼承可能會帶來多義性問題,C++中的範圍分辨符和虛基類技術都可解決此問題,但最好盡量不要使用多繼承。
範圍分辨符就是類域標記"::",文法格式如下:
<衍生類別對象名>.<基類名>::<成員函數名>(<參數表>);
虛基類是消除多義性的另一種簡單而有效方法。對於可能在不同派生路徑中產生多個成員副本的基類,可以將其設為虛基類,這樣在記憶體中,它的資料成員就只有一個副本,成員函數也只有一個映射,從而解決了同名成員函數的唯一標識問題。
虛基類有關鍵字virtual 標識,文法格式如下:
class <衍生類別名>:virtual <繼承方式> <基類名>
使用範圍分辨符時,基類的成員在記憶體中有多個副本,通過制定基類名來唯一標識使用副本,這樣可以存放不同的資料,進行不同的操作。使用虛基類技術,是基類的成員在記憶體中只有一個副本。相比之下,前者可以容納更多的資料,後者形式更加簡潔,更節省記憶體空間。可根據實際情況選擇合適的方式。
【C++】繼承(虛基類)