c#面试题:继承与构造函数的调用

wyman25 2009-04-21 09:38:39
加精
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分),谢谢
...全文
3886 183 打赏 收藏 转发到动态 举报
写回复
用AI写文章
183 条回复
切换为时间正序
请发表友善的回复…
发表回复
随枫而来 2011-09-04
  • 打赏
  • 举报
回复
虽然是2年前的帖子,但今天看到了还是学到了很多的东西,对C#的继承也有更深的理解了,在代码中学习,真的是学习语言的王道!
baoxuetianxia 2009-11-10
  • 打赏
  • 举报
回复
俩中情况 B a=new B();A a=new B();
理论是没用的,结果都是 1,0
ABNORMAL1982 2009-09-02
  • 打赏
  • 举报
回复
A a = new B(); 输入 1,0
B b = new B(); 不输出
A a1 = new A(); 不输出
B b1 = new A(); 错误
xupeihuagudulei 2009-09-01
  • 打赏
  • 举报
回复
为什么我输出来的是x=1,y=1
x=1,y=1??
andylee245 2009-05-05
  • 打赏
  • 举报
回复
哈哈,有意思啊。
madshime 2009-04-26
  • 打赏
  • 举报
回复
UP
study_ 2009-04-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Garnett_KG 的回复:]
输出1,0

因为A必须在B之前构造,但x在调用B的构造函数之前已经赋值。



[/Quote]


正确
huangbaohua 2009-04-25
  • 打赏
  • 举报
回复
若 A a = new B();或 B b = new B(); 先输出x=1.y=0再输出x=1,y=-1
buyiyanqi 2009-04-25
  • 打赏
  • 举报
回复
x=1,y=0
x=1,y=-1
请按任意键继续. . .
因为在实例化一个类时,第一步是要实例化他的基类,而在实例化基类时要使用到基类的构造函数,故调用了定义的函数,但是在调用基类的函数时,int初始化无值时为o,所以结果如上
cnfixit 2009-04-25
  • 打赏
  • 举报
回复
唉,崩溃,输出一次还是两次不是因为什么继承不继承的原因
调用了b.printfields就输出两次
x=1,y=0
x=1,y=-1
没调用仅仅是实例化对象就像上面部分人说的y还没有实例化,先执行父类构造函数但由于是虚方法就用子类的实现
输出一次,x=1,y=0
没什么好争的
至于 是A a=new B();还是B a=new B();问题的关键就不在这里
huifu 2009-04-24
  • 打赏
  • 举报
回复
呵呵,我见我们公司的笔试题也有类似的题。
主要是考继承和多太。
int 类型如果不分配值默认是0
fldx 2009-04-24
  • 打赏
  • 举报
回复
回帖是一种美德!每天回帖即可获得 10 分可用分!
kscode 2009-04-24
  • 打赏
  • 举报
回复
楼主你根本没搞清编译原理,建议你回去看看书.
就只记得继承和多态没去了解继承和多态的实现原理.

不回你的贴了,偶2年后第一次上就被你打击!
duanhanlin 2009-04-24
  • 打赏
  • 举报
回复
upupupupup!!
wyman25 2009-04-24
  • 打赏
  • 举报
回复
楼主总结:
经无数测试,以及查找资料,这道题只有一个输出:x=1,y=0 (说有两个输出的人请看清楚题目,并自己运行下)
原因:
在 new B()时候,调用B的构造函数,因为B:A,所以会构造A,即调用A的构造函数,而A的构造函数中调用一个virtual的方法PrintFields(),因为这个方法是虚拟的,并且在B中override,所以,就会直接运行B中的被override掉的方法(而不是返回去调用B的构造函数),另一方面,因为x,y在B的构造函数外已经定义,且x=1。而y没有被赋值,所以默认值为0.所以输出x=1,y=0
这题的两个要点:
1.如果构造子类,即调用子类的构造函数的话,基类的构造函数中对虚拟函数的调用不会被执行,因为它是在子类中override的,具体原因有待研究
2.int变量没有赋值时,默认值为0
535cheng110 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 llsen 的回复:]
引用 1 楼 Garnett_KG 的回复:

输出1,0

因为A必须在B之前构造,但x在调用B的构造函数之前已经赋值。


up
[/Quote]
UP
Jelindu 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 108 楼 ZeewenDotNet 的回复:]
奇怪,我自己运行过,只有一个输出的~但答案写有两个输出~怪怪怪
[/Quote]
上面都讲那么清楚了,还只有一个答案!那么多种情况都出来了,你问问题都没考虑全,高人把所有的情况和可能都讲给你了
你还怪个屁啊!搞不懂
guangboo 2009-04-24
  • 打赏
  • 举报
回复
X=1,Y=0
justin麒麟 2009-04-24
  • 打赏
  • 举报
回复
class A的构造在B之前,继承就无所谓了
longqi_e 2009-04-24
  • 打赏
  • 举报
回复
学习啦
加载更多回复(163)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧