C++ 繼承與派生(二)

派生類把基類繼承以後,怎麼樣通過派生類完成對基類成員進行初始化呢?一般默認情況下,基類的構造函數不被繼承,派生類需要定義自己的構造函數。一般情況下,通過派生類將參數傳遞給基類的構造函數,完成對基類的初始化,C++11規定,可以使用using語句繼承基類構造函數,但是隻能初始化從基類繼承的成員,語法形式:using B::B。

1. 派生類的構造函數

1.1  若不繼承基類的構造函數:

  • 派生類新增成員:派生類定義構造含函數初始化;
  • 繼承來的成員:自動調用基類構造函數進行初始化;
  • 派生類的構造函數需要給積累的構造函數傳遞參數

 1.2  單繼承時構造函數的定義語法:

派生類名::派生類名(基類所需的形參,本類成員所需的形參):
基類名(參數表),本類成員初始化列表
{
   //其他初始化
};

  1.3   多繼承時構造函數的定義語法:

派生類名::派生類名(參數表)
基類名1(基類1初始化參數表),
基類名2(基類2初始化參數表),
...
基類名n(基類n初始化參數表),
本類成員初始化列表
{
    //其他初始化;
};

1.4  派生類與基類的構造函數

當基類有默認構造函數時

  • 派生類構造函數可以不向基類構造函數傳遞參數
  • 構造派生類的對象時,基類的默認構造函數將被調用

如需執行基類中帶參數的構造函數

  • 派生類構造函數應爲基類構造函數提供參數

1.5  多繼承且有對象成員時派生的構造函數定義語法

派生類名::派生類名(形參表):
基類名1(參數),基類名2(參數),...,基類名n(參數),
本類成員(含對象成員)初始化列表
{
    //其他初始化
};

1.6  構造函數的執行順序

  • 調用基類構造函數:順序按照它們被繼承時聲明的順序(從左向右)
  • 對初始化列表中的成員進行初始化:順序按照它們在類中定義的順序,對象成員初始化時自動調用其所屬類的構造函數,由初始化列表提供參數
  • 執行派生類的構造函數體中的內容

2. 派生類的複製構造函數

若派生類沒有聲明覆制構造函數

  • 編譯器會在需要時生成一個隱含的複製構造函數;
  • 先調用基類的複製構造函數;
  • 在爲派生類新增的成員執行復制。

若派生類定義了複製構造函數

  • 一般都要爲基類的複製構造函數傳遞參數
  • 複製構造函數只能接受一個參數,及用來初始化派生類定義的成員,也將被傳遞給基類的複製構造函數。
  • 基類的複製構造函數形參類型是基類的對象的引用,實參可以是派生類對象的引用
  • 例如:C::C(const C &c1):B(c1){...}

3. 派生類的析構函數

  • 析構函數不被繼承,派生類如果需要,要自行聲明析構函數;
  • 要聲明方法與無法繼承關係時類的析構函數相同;
  • 不需要顯示地調用基類的析構函數,系統會自動隱式調用;
  • 先執行派生類析構函數的函數體,在調用派生基類的析構函數。

4. 訪問從基類繼承的成員

當派生類與基類中有相同的成員時:

  • 若未特別限定,則通過派生類對象使用的是派生類中同名成員。
  • 如要通過派生類對象訪問基類中被隱藏的同名成員,應使用基類名和作用域操作符(::)來限定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章