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