面向對象程序設計有4個主要特色:抽象、封裝、繼承和多態性。本章主要介紹有關繼承的知識,多態性將在後續章節中講解。編程
繼承性是面向對象程序設計最重要的特徵,能夠說,若是沒有掌握繼承性,就等於沒有掌握類和對象的精華,就是沒有掌握面向對象程序設計的真諦。函數
繼承可使得子類具備父類的屬性和方法或者從新定義、追加屬性和方法等。學習
萬事萬物中皆有繼承,是重要的現象。spa
案例:植物繼承圖設計
傳遞性:高等植物,蕨類植物,苔蘚都是植物,具備植物的共同特徵。3d
不對稱性:不是全部植物都屬於菌類。指針
繼承是類之間定義的一種重要關係視頻
一個B類繼承A類,或者說從A類派生B類;那麼A類稱爲基類(父類),B類稱爲派生類(子類),像父子關係同樣。對象
has-A:類的組合;use-A:友元類,作函數參數傳遞;is-A:繼承。blog
一、類繼承關係的語法
class 派生類名:基類名列表
{
//成員變量和成員函數聲明...
}
二、基類名列表:
訪問限定符 基類名1,訪問限定符 基類名2...
三、訪問限定符表示派生類對基類的繼承方式,使用關鍵字:
▷ public 公有繼承
▷ private 私有繼承
▷ protected 保護繼承
派生類繼承了基類的所有成員變量和成員方法(除了構造和析構以外的成員方法),可是這些成員的訪問屬性,在派生過程當中是能夠調整的。
說明:
一、子類擁有父類的全部成員變量和成員函數;
二、子類能夠擁有父類沒有的方法和屬性;
三、子類就是一種特殊的父類;
四、子類對象能夠看成父類對象使用(在父類作函數形參時,能夠傳子類對象)。
實例:
一、不一樣的繼承方式會改變繼承成員的訪問屬性
public繼承:父類成員在子類中保持原有訪問級別;
private繼承:父類成員在子類中變爲private成員;
protected繼承:父類中public成員會變成protected。
父類中protected成員仍然爲protected;父類中private成員仍然爲private
二、private成員在子類中依然存在,可是卻沒法訪問到。不論種方式繼承,派生類都不能直接使用基類的私有成員 。(能夠經過提供接口訪問)
類的繼承方式會影響父類的屬性在子類中的訪問權限。
一、如何判斷成員是否能被訪問:「三看」原則
1> 看調用語句,是再寫在子類的內部仍是外部;
2> 看子類如何從父類繼承;
3> 看父類訪問級別。
二、派生類類成員訪問級別設置的原則
思考:如何恰當的使用public,protected和private爲成員聲明訪問級別?
1> 須要被外界訪問的成員直接設置爲public;
2> 只能在當前類中訪問的成員設置爲private;
3> 只能在當前類和子類中訪問的成員設置爲protected,protected成員的訪問權限介於public和private之間。
PS:通常狀況下,均使用public繼承方式。
類型兼容規則是指在須要基類對象的任何地方,均可以使用公有派生類的對象來替代。
經過公有繼承,派生類獲得了基類中除構造函數、析構函數以外的全部成員。這樣,公有派生類實際就具有了基類的全部功能,凡是基類能解決的問題,公有派生類均可以解決。
類型兼容規則中所指的替代包括如下狀況:
▷ 子類對象能夠看成父類對象使用
▷ 子類對象能夠直接賦值給父類對象
▷ 子類對象能夠直接初始化父類對象
▷ 父類指針能夠直接指向子類對象
▷ 父類引用能夠直接引用子類對象
在替代以後,派生類對象就能夠做爲基類的對象使用,可是隻能使用從基類繼承的成員。
類型兼容規則是多態性的重要基礎之一。
總結:子類就是特殊的父類。
一、問題:子類如何初始化父類成員?父類與子類的構造函數有什麼關係?
☆ 在子類對象構造時,須要調用父類構造函數對其繼承得來的成員進行初始化。
☆ 在子類對象析構時,須要調用父類析構函數對其繼承得來的成員進行清理。
二、繼承中的構造析構調用原則
☆ 子類對象在建立時會首先調用父類的構造函數;
☆ 父類構造函數執行結束後,執行子類的構造函數;
☆ 當父類的構造函數有參數時,須要在子類的初始化列表中顯示調用;
☆ 析構函數調用的前後順序與構造函數相反。
一、當子類成員變量與父類成員變量同名時,子類依然從父類繼承同名成員
二、在子類中經過做用域分辨符::進行同名成員區分(在派生類中使用基類的同名成員,顯式地使用類名限定符)
三、同名成員存儲在內存中的不一樣位置
總結:同名成員變量和成員函數經過做用域分辨符進行區分。
繼承和static關鍵字在一塊兒會產生什麼現象?
▷ 基類定義的靜態成員,將被全部派生類共享
▷ 派生類中訪問靜態成員,用如下形式顯式說明:
派生類只有一個基類,稱爲單繼承(Single Inheritance)。除此以外,C++也支持多繼承(Multiple Inheritance),即一個派生類能夠有兩個或多個基類。
多繼承容易讓代碼邏輯複雜、思路混亂,一直備受爭議,後來的 Java、C#、PHP 等乾脆取消了多繼承。
若是一個派生類從多個基類派生,而這些基類又有一個共同的基類,則在對該基類中聲明的名字進行訪問時,可能產生二義性。
爲了解決多繼承時的命名衝突和冗餘數據問題,C++ 提出了虛繼承,使得在派生類中只保留一份間接基類的成員。
使用關鍵字Virtual:
好啦,今天的學習就到此爲止吧~明天繼續~
最後,無論你是轉行也好,初學也罷,進階也可,若是你想學編程~
【值得關注】個人 C/C++編程學習交流俱樂部!【點擊進入】
問題答疑,學習交流,技術探討,還有超多編程資源大全,零基礎的視頻也超棒~