在下面的示例中,首先调用哪个构造函数?当我提出断点并执行它时,首先指向子构造函数但执行了父类构造函数,为什么会这样?
任何人都可以澄清一下吗?
class Program
{
static void Main(string[] args)
{
Child child = new Child();
child.print();
Console.ReadLine();
}
}
public class Parent
{
public Parent()
{
Console.WriteLine("Parent Constructor.");
}
public void print()
{
Console.WriteLine("I'm a Parent Class.");
}
}
public class Child : Parent
{
public Child()
{
Console.WriteLine("Child Constructor.");
}
public new void print()
{
Console.WriteLine("I'm a Child Class.");
}
}
答案 0 :(得分:4)
从C#生成的构造函数首先被调用基类,所以:
基本上,已链接的base:.ctor({args})
会附加到本地.ctor
出于这个原因,你应该避免在构造期间调用虚方法,就像Child覆盖它一样,它可能会失败,因为Child还没有初始化那里定义的字段(它们将是零)。
在C ++ / CLI中,您可以选择执行的操作顺序。
答案 1 :(得分:0)
首先构建父,因为它是Child的核心。 如果孩子的核心(父母)没有,则无法构建孩子。
请注意,类的初始化不仅限于执行其构造函数。它还初始化其字段。
在下面的示例中,您确实希望Child的构造函数显示x = 3。如果不是,那就意味着你的派生类不能基于它的祖先行为。
public class Parent
{
public int x;
public Parent()
{
x = 3;
}
}
public class Child : Parent
{
public Child()
{
Console.WriteLine("Child Constructor. x="+x.ToString());
}
}