using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class A//new一个子类B的话,会先调用父类的构造函数,在调用子类的构造函数;然后,在调用子类的方法B.PrintFields().
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
static void Main(string[] args)
{
new B().PrintFields();
Console.ReadKey();
//Console.WriteLine("x={0},y={1}", x, y);
}
}
总结:如果子类定义了构造方法,在创建子类的对象的时候,首先执行父类的构造方法,然后执行自己的构造方法,父类的构造方法 public A()里面有PrintFields()——>public virtual void PrintFields(){}因为是虚函数so--->B类的重写函数public override void PrintFields()--->输出了x=1,y=0--->然后执行子类子类构造函数public B()--->y=-1;又因为在创建对象的时候在调用子类的函数PrintFields(),所以在执行完父类构造函数和子类构造函数之后,会再次执行子类的public override void PrintFields()函数--->再次输出了x=1,y=-1。