c#面试题:继承与构造函数的调用using Systemclass A{public A(){PrintFields()}public virtual void Pri
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(); 这样写是错误的,子类的对象不能被父类实例华。 [解决办法]
[解决办法] 在创建一个类的实例的时候,是先创建一个唯一的父类,然后在父类的基础上构建其子类,C#中所有的类都是这样,当把一个子类实例赋给一个父类的变量名的时候 就像 B val = new A(); 其实 val 还是指向父类的,并不是指向子类,(上面说了,先创建唯一的父类,并且父类和子类的并不是创建之后就脱离了关系) 当val调用了父类中的虚方法时,会自动调用子类中提供的方法(如果有的话)