C++入門到精通:面向對象程序設計中的繼承與派生!

面向對象程序設計有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成員

繼承和static關鍵字在一塊兒會產生什麼現象?

    ▷ 基類定義的靜態成員,將被全部派生類共享

    ▷ 派生類中訪問靜態成員,用如下形式顯式說明:


 

接下來的內容


 

 

░ 多繼承

派生類只有一個基類,稱爲單繼承(Single Inheritance)。除此以外,C++也支持多繼承(Multiple Inheritance),即一個派生類能夠有兩個或多個基類。

多繼承容易讓代碼邏輯複雜、思路混亂,一直備受爭議,後來的 Java、C#、PHP 等乾脆取消了多繼承。


 

 

░ 多繼承的二義性

若是一個派生類從多個基類派生,而這些基類又有一個共同的基類,則在對該基類中聲明的名字進行訪問時,可能產生二義性。

爲了解決多繼承時的命名衝突和冗餘數據問題,C++ 提出了虛繼承,使得在派生類中只保留一份間接基類的成員。

使用關鍵字Virtual:


 

好啦,今天的學習就到此爲止吧~明天繼續~


 

最後,無論你是轉行也好,初學也罷,進階也可,若是你想學編程~

【值得關注】個人 C/C++編程學習交流俱樂部!【點擊進入】

問題答疑,學習交流,技術探討,還有超多編程資源大全,零基礎的視頻也超棒~

相關文章
相關標籤/搜索