C# 關於C#中派生類調用基類構造函數的理解

1、 當基類中沒有自己編寫構造函數時,派生類默認的調用基類的默認構造函數
在這裏插入圖片描述
在這裏插入圖片描述
2、 當基類中編寫構造函數時,派生類沒有指定調用構造哪個構造函數時,會尋找無參的構造函數,如果沒有則報錯,另外無論調用派生類中的哪個構造函數都是尋找無參的那個基類構造函數,而非參數匹配。

在這裏插入圖片描述
3、 基類中編寫了構造函數,則派生類中可以指定調用基類的某個構造函數,使用base關鍵字。

在這裏插入圖片描述
在這裏插入圖片描述

派生類構造函數執行順序

針對派生類,創建對象的基類部分過程中會隱式調用基類的某一個構造函數作爲創建實例過程的一部分,在繼承層次鏈中的每個類在創建對象過程中,執行自己的構造函數體之前都要執行它的基類構造函數。

也就是說,如果派生類的基類也是派生類,則每個派生類只需負責其直接基類的構造,不負責簡介基類的構造,並且實例構造函數的順序是從最上面的基類開始下溯的,靜態構造函數是從下面的類開始上溯的(下面代碼解釋了這個問題)。

注意,在構造函數中要避免調用虛函數方法。在執行基類構造函數是,在執行派生類的構造函數方法體,基類的虛方法會調用派生類的覆寫方法,因此調用會在派生類沒有完全初始化之前傳遞到派生類。

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述
二、構造函數初始化語句
一般情況下在實例化派生類對象的時候都會調用基類的無參數構造函數,但是構造函數是可以重載的,所以基類可能有多個構造函數。我們在顯示的創建有參數構造函數的時候,這樣系統就不會自動創建默認無參數構造函數,所以我們在創建有參數構造函數的時候,要同時再顯示創建一個無參數的和默認形式相同的構造函數,這樣設計纔是優雅的設計。

當聲明一個不帶構造函數初始化語句的構造函數時,其實是省略了base()構造函數初始化語句,如下兩個形式是等價的:

/* 等價的構造函數初始化語句 */

  class DrivedClass : BaseClass
 {
DrivedClass()                //隱式使用基類構造函數BaseClass()的構造函數
{
    ...
}
 }

  class DrivedClass : BaseClass
{
DrivedClass() : base()      //顯示使用基類構造函數BaseClass()的構造函數
{
    ...
}
}

如果想要派生類使用指定的基類構造函數然不是默認的無參數構造函數,可以使用「構造函數初始化語句」來進行指定。可以從以下兩個形式:

  1. 使用關鍵字base並指明使用哪一個基類構造函數

  2. 作用:使用base()指明使用基類的哪一個構造函數;

  3. 用法:使用有關鍵字base的構造函數初始化語句和要調用的基類構造函數參數列表

在這裏插入圖片描述