繼承

1.什麼是繼承?
繼承是面向對象編程提供可重用代碼的重要手段 ,它允許我們在保持原有類特性的基礎上,對原有類進行拓展和修改派生出新的類,從已有類(基類/父類)派生出新的類稱爲派生類(子類)。
繼承類定義的格式:class 派生類名稱:繼承類型(pub/pro/pri) 基類名稱
其繼承類型有三種:public,private和protected,默認爲private。

2.派生類的特徵

  • 派生類必須繼承基類的所有成員(不包括構造函數,析構函數和賦值運算符重載),即派生類繼承了基類的實現和接口。
  • 派生類可以根據自己的需要額外添加數據成員和成員函數。
  • 派生類需要自己的構造函數和析構函數。

3.派生類的訪問權限
派生類成員函數對基類成員函數的訪問權限取決於基類對基類成員的權限和派生類的繼承方式,
具體如下表格:

這裏寫圖片描述
public:派生類內和對象都可訪問
protected:派生類內可訪問,對象不可訪問
private:派生類內可訪問
不可見:都不可訪問
如果想訪問基類private成員函數,可以通過基類public接口來訪問。
public繼承是is-a的關係,即每一個派生類對象都是一種基類對象,反之不成立.就像學生是人而人不一定是學生的關係。

4.派生類的默認成員函數
在繼承關係裏,派生類如果沒有顯示的定義這六個成員函數(構造函數,拷貝構造函數,析構函數,賦值運算符重載,取地址操作符重載,const修飾的取地址操作符重載),編譯器會默認合成。
派生類構造函數的初始化表達式:派生類構造函數名(參數列表):基類構造函數名(參數列表){派生類構造函數體}
在進入新類的構造函數體之前調用所有其他基類的構造函數,如果無法調用基類的構造函數,就無法繼續往下進行。
派生類構造函數的調用次序:
這裏寫圖片描述
派生類析構函數的調用次序:
這裏寫圖片描述

5.派生類和基類之間特殊關係
基類指針(引用)可以在不用顯式轉化的情況下指向(引用)派生類對象,但是不可以將基類對象和地址賦給派生類指針和引用(可強轉)。
同樣的派生類對象可以賦值給基類對象,基類對象不能賦值給派生類對象。

6.名字隱藏
在繼承體系中,基類和派生類是兩個不同的作用域,如果派生類和基類中有同名成員,派生類成員將屏蔽基類對成員的直接訪問(在派生類成員函數中,可以使用基類::基類成員訪問),所以在繼承體系中最好不要定義同名成員。
這裏寫圖片描述

7.多重繼承
通過多個基類來創建一個新類。
例如class D:public B1,public B2{//D的新增成員};,類D同時繼承了B1和B2。
多重繼承的構造函數與單繼承的類似,例如類D的構造函數爲D():B1(),B2(){//構造函數體}
菱形繼承:這裏寫圖片描述

下面是一段菱形繼承的代碼:

class B
{
public:
    void Bfun();
};

class C1:public B
{
public:
    void C1fun();
};

class C2:public B
{
public:
    void C2fun();
};

class D:public C1,public C2
{
public:
    void Dfun();
};

int main()
{
    D d;
    d.Bfun();
    return 0;
}

這段代碼編譯器會報出一個錯誤:對“Bfun”的訪問不明確。這是因爲菱形繼承中存在一個二義性問題,當通過派生類D調用基類B中的Bfun()函數時,編譯器並不清楚是通過C1還是通過C2來調用基類裏面的函數。正確的做法是,再派生類裏面調用基類成員函數時加上作用域限定符,例如d.C1::Bfun();
但是這樣代碼會顯得冗雜,我們可以用另一種方法來解決二義性問題-虛繼承
這裏寫圖片描述
這樣,虛繼承解決了在菱形繼承體系裏面子類對象包含多份父類對象的數據冗餘&浪費空間的問題。虛繼體系看起來很複雜,在實際應用我們通常不會定義如此複雜的繼承體系。一般不到萬不得已都不要定義菱形結構的虛繼承體系結構,因爲使用虛繼承解決數據冗餘問題也帶來了性能上的損耗。
知道類虛基類,那麼對象初始化順序可以完整的給出了。
對象初始化順序:(注:《c++編程思想》P828)
1)所有虛基類子對象,按照他們在類定義中出現的位置,從上到下從左到右進行初始化
2)然後非虛基類按照通常順序初始化。
3)所有成員對象按聲明順序初始化。
4)完整的對象的構造函數的執行。

7.其他
- 友元關係不能繼承,基類友元不能訪問派生類私有和保護成員
- 基類定義了static成員,則整個繼承體系裏面只有一個這樣的成員。無論派生出多少個子類,都只有
一個static成員實例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章