天天看點

C++特性——繼承

學習C++有一段時間了,今天就來總結一下C++的第二個特性——繼承。

首先介紹一下繼承的概念,所謂的繼承就是用已有的類(基類),根據實際需要定義新的類(派生類)的過程,其實質是代碼複用。繼承關系如下圖所示:

C++特性——繼承

當然,派生類的資料并不是全部來自于基類,也可以根據需要在派生類中添加額外的成員變量和成員方法。

繼承的文法結構: 類辨別 派生類類名:繼承方式:基類類名

繼承方式有3種:public protected private

其中,采用public繼承方式的派生類通路不受限制,采用protected繼承方式的派生類隻允許在本類和子類類中通路,而采用private繼承方式的派生類隻允許在本類類中通路。

說到這裡可能會有人産生疑問,是不是派生類的通路限定隻跟繼承方式有關呢?其實并不是這樣的,

不同通路限定符修飾的基類,采用不同的繼承方式繼承後,其派生類的通路限定也是不一樣的。其關系如下圖所示:

C++特性——繼承

繼承應該考慮的問題

1、派生類的構造和析構順秀

系統在建立派生類對象時,會先調用基類的構造函數,用于初始化繼承的資料成員,然後再調用派生類的構造函數,用于初始化新增的資料成員。派生類的構造函數總是調用一個基類的構造函數,并使用初始化器清單指明要使用那個基類的構造函數,否則将使用預設的基類的構造函數。

銷毀對象時,與調用構造函數的順序相反,系統會先調用派生類的析構函數,然後再調用基類析構函數。

2、派生類和基類的關系

派生類可以使用基類非私有的方法;

基類指針(或引用)可以不進行顯式類型轉換的情況下指向(或引用)派生類對象;

基類指針(或引用)隻能調用基類的方法,不能調用派生類的方法。

3、繼承的範圍

派生類****不能通過繼承繼承基類的構造函數、析構函數和指派運算符。

一般,派生類在建立對象時,會使用成員初始化清單調用基類的構造函數,用來建立派生對象的基類部分,否則将使用基類的預設構造函數。在繼承鍊中,每一個類都可以使用成員初始化清單将資訊傳遞給相鄰的基類。

派生類在銷毀對象時,程式會先調用派生類的析構函數,然後再調用基類的析構函數。如果基類有預設析構函數,編譯器将為派生類生成預設析構函數。一般,基類的析構函數設定為虛的。

指派運算符不能繼承的原因是,派生類繼承的方法的特征标與基類完全相同,但指派運算符的特征标随類而異。

總的來說,派生類通過繼承繼承了基類除構造函數、析構函數指派運算符之外的所有成員,包括類型和作用域。