派生類的構造函數 與基類的調用關係

基類的構造函數不能被繼承,但可以在派生類中的構造函數調用,通過base()調用
 
看代碼說問題吧。
    public class A
    {
        
public A(string
 a) { }
    }
    
public class
 B:A
    {
        
public
 B() { }
    }
這段代碼編譯後,會有個錯誤提示:A does not contain a constructor that takes '0' arguments ,中文意思類A沒有包含無參構造函數。按照提示,我在類A中,添加了無參構造函數,問題解決了。那麼爲什麼會這樣呢,我們知道,子類在創建對象執行構造函數之前會先執行父類的構造函數,那麼假如父類中有多個構造函數,又是執行哪個呢,這時候base這個關鍵字我想可以來說明一切。還是看代碼吧:
    public class A
    {
        
public
 A() { }
        
public A(string
 a) { }
    }
    
public class
 B:A
    {
        
public B():base
()
        { }
    }
跟上面的代碼差不多,我在A中添加了無參構造函數,然後在B中修改了這句:pubic B():base(){},然後我們測試下,創建一個B對象,在A類中的2個構造函數中設置斷點,發現無參構造函數執行了,我想正是因爲這個base在這裏發揮了作用,是base()指向了父類的無參構造函數。其實,在類B中,我們完全可以省略 base(),也能正常運行,我想,這是系統默認指向了父類的無參構造函數的原因吧,所以也可以省略了,其實大多數時候,我們都是省略不寫的。看到這裏,我想你應該知道第一段代碼中提示的錯誤的原因了吧,原因是A類中沒有無參的構造函數,這樣在執行B中的構造函數的時候,就沒法執行A中的無參構造函數了。 下面我在寫一段不使用無參構造函數的代碼,看了會更加清晰:

    public class A
    {
        
public A(string
 a)
        {
            
//

        }
    }
    
public class
 B:A
    {
        
public B(string a):base
(a)
        {
            
//

        }
    }
B中的構造函數指定了調用父類的A(string a)構造函數。這樣我們創建B對象在執行構造函數前就會執行父類中對應的指定的構造函數了。
 
發佈了60 篇原創文章 · 獲贊 8 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章