构造函数和继承
问题描述:
我读到处是:构造函数和继承
构造函数没有从基类继承的类上
如果这是真的,那么
哪有一个基类的默认构造函数调用时我们创建派生类的对象?
例如:
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
}
}
答
你可以看看由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
的延伸。鉴于此,对于要构建的B
,A
位必须在B
之前构建,否则B
将无法访问并且由A
提供的功能。
该如何由Sergey Mozhaykin提供的答案。
您可以通过添加非默认的构造函数来A
(从而消除默认的,无参数之一)证明了这一点,代码将无法编译,因为B
不再知道如何构造A
。
它们不是继承的,但它们可以(也应该)从子类构造函数调用来初始化父类。 – Niko 2014-09-27 19:56:13
http://msdn.microsoft.com/en-us/library/ace5hbzh.aspx – RenniePet 2014-09-27 19:58:17
默认构造函数被调用来构造基础。如果您不想在派生类中使用默认构造函数,则可以使用':base(parameter)'语法强制调用其他构造函数。 – 2014-09-27 20:04:15