c++再回首之繼承

繼承乃c++三大特性之一,可見其重要性,在此總結一下繼承的特性:

一.繼承概念

繼承(inheritance)機制是面向對象程序設計使代碼可以複用的最重要的手段,它允許程序員在保持
原有類特性的基礎上進行擴展,增加功能。這樣產生新的類,稱派生類。繼承呈現了面向對象程序設
計的層次結構,體現了由簡單到複雜的認知過程。

打個形象的比喻:繼承就是爸爸和兒子之間的關係,父親生了兒子,兒子繼承了爸爸身上的特點,比如高大的身軀,英俊的容顏,當然兒子也有自己的特點,比如敏捷的思維,溫和的性格。

繼承定義格式

二.繼承關係&訪問限定符





歸納:
1.public繼承是一個接口繼承,保持is-a原則,每個父類可用的成員對子類也可用,因爲每個子類對象也都是一個父類對象。
2.protetced/private繼承是一個實現繼承,基類的部分成員並非完全成爲子類接口的一部分,是 has-a 的關係原則,所以非特殊情況下不會使用這兩種繼承關係,在絕大多數的場景下使用的都是公有繼承。
3.大多數情況下用的都是公有繼承,其他兩種極少數使用
4.定義爲struct的類默認繼承方式爲struct,class則是private
5.構造,析構函數是無法繼承的
6,除了賦值運算符以外,其他重載的操作符 都可以繼承
7.靜態成員可以繼承。
8.友元無法繼承(驗證:http://blog.csdn.net/db199410/article/details/51679181)

三.派生類的六個默認成員函數

在繼承關係裏面,在派生類中如果沒有顯示定義這六個成員函數,編譯系統則會默認合成這六個默認
的成員函數。




**繼承關係中構造順序

**繼承關係中析構順序


注意點:
1、基類沒有缺省構造函數,派生類必須要在初始化列表中顯式給出基類名和參數列表。
2、基類沒有定義構造函數,則派生類也可以不用定義,全部使用缺省構造函數。
3、基類定義了帶有形參表構造函數,派生類就一定定義構造函數。



四.繼承體系中的作用域

1. 在繼承體系中基類和派生類是兩個不同作用域。
2. 子類和父類中有同名成員,子類成員將屏蔽父類對成員的直接訪問。(在子類成員函數中,可以
使用 基類::基類成員 訪問)--隱藏 --重定義(成員函數的重載,覆蓋與隱藏,參見:http://blog.csdn.net/db199410/article/details/51578047
3. 注意在實際中在繼承體系裏面最好不要定義同名的成員。


五.賦值兼容規則

在public繼承的前提下:
1.子類對象可以賦值給父類對象(切割/切片)
2. 父類對象不能賦值給子類對象
3. 父類的指針/引用可以指向子類對象
4. 子類的指針/引用不能指向父類對象(可以通過強制類型轉換完成,但是這樣做是不安全的,因爲子類指針無法訪問到子類中特有的成員

六.單繼承&多繼承&菱形繼承

單繼承
一個子類只有一個父類稱爲單繼承



多繼承
一個子類有多個父類時稱爲多繼承




菱形繼承





虛繼承--解決菱形繼承的二義性和數據冗餘的問題
1. 虛繼承解決了在菱形繼承體系裏面子類對象包含多份父類對象的數據冗餘&浪費空間的問題。
2. 虛繼承體系看起來好複雜,在實際應用我們通常不會定義如此複雜的繼承體系。一般不到萬不得
已都不要定義菱形結構的虛繼承體系結構,因爲使用虛繼承解決數據冗餘問題也帶來了性能上的
損耗。


發佈了49 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章