namespace 继承
{
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
Console.WriteLine("x={0},y={1}", x, y);
}
public override void PrintFields() //步骤3 : 运行这个方法
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
}
}
}上述程序在运行的时候,发现是先运行A的构造函数,然后A的构造函数中调用PrintFields虚函数,最后调用了B类中的PrintFields函数。可如果将main函数中的语句改为 A a=new A(),执行的指示A的虚函数PrintFields,而不是B中的PrintFields方法。我知道,
当调用一个对象的虚函数时,系统会直接去检查这个对象的实例是哪个类型,然后在这个类中找到虚函数的override方法。但是上述过程中,A的构造函数调用的时候,到底是哪个对象的实例在调用虚函数PrintFields呢!
{
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
Console.WriteLine("x={0},y={1}", x, y);
}
public override void PrintFields() //步骤3 : 运行这个方法
{
Console.WriteLine("x={0},y={1}", x, y);
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
}
}
}上述程序在运行的时候,发现是先运行A的构造函数,然后A的构造函数中调用PrintFields虚函数,最后调用了B类中的PrintFields函数。可如果将main函数中的语句改为 A a=new A(),执行的指示A的虚函数PrintFields,而不是B中的PrintFields方法。我知道,
当调用一个对象的虚函数时,系统会直接去检查这个对象的实例是哪个类型,然后在这个类中找到虚函数的override方法。但是上述过程中,A的构造函数调用的时候,到底是哪个对象的实例在调用虚函数PrintFields呢!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货