c#面试题:继承与构造函数的调用 using System; class A { 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); } 当使用new B()创建B的实例时,产生什么输出?(20分)为什么?请详细说明(80分),谢谢
------解决方案-------------------- 输出1,0
因为A必须在B之前构造,但x在调用B的构造函数之前已经赋值。
------解决方案-------------------- 两种情况 (1) A a = new B(); 这样的话,a.PrintFields()调用的是B的PrintFields方法,输出x=1,y=-1,因为使用B实例化a,所以调用B类的PrintFields方法; (2) B b = new B(); 这样的话b.PrintFields()调用的也是B的PrintFields方法,输出x=-1,y=-1,因为B的对象被B类实例化,调用的必然是B的东西; (3) A a = new A(); 这样调用的是A的PrintFields()方法,什么都不输出; (4) B b = new A(); 这样写是错误的,子类的对象不能被父类实例华。
------解决方案--------------------