构造函数和继承

问题描述:

我读到处是:构造函数和继承

构造函数没有从基类继承的类上

如果这是真的,那么

哪有一个基类的默认构造函数调用时我们创建派生类的对象?

例如:

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

你可以看看由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

基类的默认无参构造函数将始终隐式调用。如果您的基类没有无参数构造函数,那么您的派生类必须调用该构造函数并提供必要的参数。

Will the base class constructor be automatically called?

所以没有回答你的问题,一个基类的构造方法中没有inheritered,但会叫这样或那样的,无论是你的派生类的构造函数或隐式当您使用关键字。

为什么

在您的例子B IS-A A,这是它是一个A的延伸。鉴于此,对于要构建的BA位必须在B之前构建,否则B将无法​​访问并且由A提供的功能。

如何Sergey Mozhaykin提供的答案。

您可以通过添加非默认的构造函数来A(从而消除默认的,无参数之一)证明了这一点,代码将无法编译,因为B不再知道如何构造A