構造函數和析構函數都不能繼承。
- 派生類的構造函數承擔着對基類中數據成員初始化和對派生類自身數據成員初始化的雙重任務。
- 派生類的析構函數應包含着基類的析構函數,用來釋放基類中的數據成員
單繼承
派生類構造函數的執行順序如下
- 先執行基類構造函數;
- 再執行子對象的構造函數(如有子對象的話)
- 最後執行派生類構造函數的函數體
派生類構造函數的成員初始化列表中應該顯式地包含基類中帶參數的構造函數,或者隱含地包含基類中的默認構造函數
派生類析構函數的指向順序如下
- 先執行派生類的析構函數
- 再執行子對象所在類的析構函數(如果有子對象的話)
- 最後執行基類中的析構函數
由於析構函數不能繼承,因此在派生類的析構函數中要包含它的直接基類的析構函數
多繼承:
多繼承的構造函數和析構函數
- 在多重繼承派生類構造函數中,先執行基類的構造函數。多個基類構造函數的執行順序取決於定義派生類時規定的先後順序,與派生類的成員初始化列表中順序無關。
- 多重繼承派生類的析構函數中隱含着直接基類的析構函數,但其執行順序與構造函數相反
- 派生類構造函數中可以隱含着直接基類的默認構造函數。
多繼承的二義性
- 調用不同基類中的相同成員可能會出現二義性
要在調用的函數前加上類的域。<類名>::<函數名>
來調用函數一避免二義性。
虛基類
- 用於有共同基類的場合。
- 用
virtual
修飾符來說明。
作用
- 主要用來解決多繼承時可能發生的 對同一基類多次繼承 而產生的二義性問題。
- 爲最遠的派生類提供唯一的基類成員,而不重複產生多次拷貝。
即在派生類中調用的成員是直接調用的虛基類中的。
在第一次繼承時就要將共同基類設計爲虛基類
當基類通過多條派生路徑被一個派生類繼承時,該派生類只繼承該基類一次。
注意:爲了保證虛基類在派生類中只繼承一次,應當在該基類的所有直接派生類中聲明爲虛基類。否則仍然會出現對基類的多次繼承。
含有虛基類的派生類的構造函數
- 建立對象時所指定的類稱爲最(遠)派生類。
- 虛基類的成員是由最(遠)派生類的構造函數通過調用虛基類的構造函數進行初始化的。
- 在整個繼承結構中,直接或間接繼承虛基類的所有派生類,都必須在構造函數的成員初始化表中給出對虛基類的構造函數的調用。
- 在建立對象時,只有最(遠)派生類的構造函數調用虛基類的構造函數。