2014-09-27 199 views
1

我讀到處是:構造函數和繼承

構造函數沒有從基類繼承的類上

如果這是真的,那麼

哪有一個基類的默認構造函數調用時我們創建派生類的對象?

例如:

public class A 
{ 
    public void AA() 
    { 
     //anything 
    } 
} 

public class B : A 
{ 
    public void BB() 
    { 
     //anything 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 

     B Bobject = new B(); // Why it will call class A's default constructor if constructors not inherit from base to derived class 
    } 
} 
+0

它們不是繼承的,但它們可以(也應該)從子類構造函數調用來初始化父類。 – Niko 2014-09-27 19:56:13

+0

http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx – RenniePet 2014-09-27 19:58:17

+0

默認構造函數被調用來構造基礎。如果您不想在派生類中使用默認構造函數,則可以使用':base(parameter)'語法強制調用其他構造函數。 – 2014-09-27 20:04:15

回答

1

你可以看看由C#編譯器生成的IL。這是爲B構造函數生成的:

B..ctor: 
IL_0000: ldarg.0  
IL_0001: call  A..ctor 
IL_0006: nop   
IL_0007: nop   
IL_0008: nop   
IL_0009: ret 
+0

你的回答很好,但他想要這個原因,而不是這個核心 – 2014-09-27 20:28:15

1

基類的默認無參構造函數將始終隱式調用。如果您的基類沒有無參數構造函數,那麼您的派生類必須調用該構造函數並提供必要的參數。

Will the base class constructor be automatically called?

所以沒有回答你的問題,一個基類的構造方法中沒有inheritered,但會叫這樣或那樣的,無論是你的派生類的構造函數或隱式當您使用關鍵字。

0

爲什麼

在您的例子B IS-A A,這是它是一個A的延伸。鑑於此,對於要構建的BA位必須在B之前構建,否則B將無法​​訪問並且由A提供的功能。

如何Sergey Mozhaykin提供的答案。

您可以通過添加非默認的構造函數來A(從而消除默認的,無參數之一)證明了這一點,代碼將無法編譯,因爲B不再知道如何構造A