一 繼承與派生
從上面的例子可以看出:
繼承:一旦指定了某種事物父代的本質特征,那么它的子代將會自動具有哪些性質。這就是一種樸素的可重用的概念。
派生:而且子代可以擁有父代沒有的特性,這是可擴充的概念。
1 C++ 的繼承關系
繼承就是在一個已經存在的類的基礎上建立另一個新的類。
已存在的類稱為“基類”或“父類”,新建立的類稱為“派生類”或“子類”。如圖所示:
2 派生類的特性
派生類的功能主要通過以下方式來體現:
洗手基類成員;
改造基類成員;
添加新成員;
從編碼的角度來看,派生類重基類中比較低的代價換來較大的靈活性:
派生類可以對繼承的屬性進行擴展、限制或改變。
一旦產生了可靠的基類,只需要調試派生類中所做的修改即可。
二 繼承方式:單繼承
1 單繼承和多繼承
單繼承:派生類只有一個直接基類。
多繼承:派生類有多個直接基類。
2 單繼承派生類
定義單繼承派生類的語法格式:
class 派生類名:<繼承方式>基類名{
…//派生修飾基類的成員
public private protected
};
雖然繼承了基類的所有成員,但是派生類并非都能訪問基類的所有成員,繼承方式會影響派生類對基類中各種成員的使用。
回顧類成員的訪問方式也有public、private、protected分別是什么意思?
和我們這里基礎方式的public、private、protected有區別嗎?
公有派生類
class派生類名:public基類名{
…//派生類新添加的成員
};
基類的成員在公有派生類中引用權限
不可訪問成員
在類外補能被直接訪問。
在派生類的類內部能被直接訪問。
3私有派生類
class派生類名:private基類名{
…//派生類新添加的成員
};
基類的成員在私有派生類中引用權限。
4 公有派生和私有派生的比較
雖然派生類繼承了基類所有的成員,但是對于派生類來說,基類的私有成員時不可見的,因此不能被派生類所訪問。
5 保護成員的引入
為了解決這個問題,C++專門設置了保護成員,即用protected關鍵字說明的成員。
保護成員的特性:
能夠被基類和派生類所訪問。
和私有成員一樣,類外不能訪問。
6 保護派生類
class派生類名:protected基類名{
…//派生類新添加的成員
};
基類的成員在保護派生類中引用權限
7 小結
不同的繼承方式,子類對基類中的成員的訪問權限如下表所示:
三 派生類與基類同名成員的訪問方式
1 派生類與基類同名成員的訪問方式
C++允許派生類可以重新定義基類的成員,此時稱派生類的成員覆蓋了基類的同名成員。
如果在派生類中,想使用基類的同名成員,則可以顯式地使用類名+限定符的方式,如下所示:
舉例
四 賦值兼容規則
在公有派生方式下,派生類對象可以作為基類對象來使用,具體方式如下:
派生類的對象可以直接賦值給基類的對象;
基類對象的引用可以引用一個派生類對象;
基類對象的指針可以指向一個派生類對象;
五 單繼承的構造與析構
1 單繼承派生類的構造函數
派生類構造函數(參數表):基類構造函數(參數表),對象成員1(參數表),…對象成員n(參數表)
{
…//初始化自定義數據成員
}
如果基類使用的是缺省的構造函數或不帶參數的構造函數,那么在初始化列表中可以省略“基類構造函數(參數表)”這一項。
2 構造函數和析構調用順序
構造函數的調用順序如下:
先調用基類構造函數;
再調用對象成員所屬類的構造函數;
最后調用派生類構造函數;
析構函數的調用順序如下:
先調用派生類的析構函數;
再調用對象成員所屬類的析構函數;
最后調用基類的析構函數;