关于面试中虚方法的疑问

beckge 2007-06-28 10:05:18
在面试中,常见的考查虚方法时,有下面这样的一道题目,小弟不懂,望各位哥哥姐姐弟弟妹妹指点!!!希望能详细一点!之所以现在网上很多这道题目,还在这里献丑,实在是因为他们的答案很不统一,存在很多疑问,所以请教大家,谢谢~~
===================================================
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的实例时,产生什么输出?

有答案说是:(X=1,Y=0;x= 1 y = -1)???顺序是不是反了?
也有答案说是:(X=1,Y=0)------------------------> ③的输出??
=========================================
其中①②③处会在运行中起什么作用?
在B实例化的时候,①②处怎样执行,执行时产生什么?
...全文
524 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxiong87437624 2007-07-17
  • 打赏
  • 举报
回复
哈哈,共同学习
wuhuiITren 2007-07-17
  • 打赏
  • 举报
回复
哈哈,共同学习
xiaotupansy 2007-07-12
  • 打赏
  • 举报
回复
首先告诉你是1,0

你可以自己试验一下

原因是

C#初始化是有顺序的,就是先字段,后构造函数,先基类,后子类,也就是说
B b=new B()的时候,他是先初始化A的字段,然后是b的字段,这个时候x=1,y=0(默认)
然后先执行a的构造函数,调用 PrintFields,然后clr发现 PrintFields这个方法标记为virtual,于是就去b中寻找是不是有override的 PrintFields,结果发现有,于是就执行b的 PrintFields,
此时x=1,y=0就是字段初始化的值,所以输出1,0,输出完了之后再执行b的构造函数,然后y就被赋值为-1
miser1982 2007-07-12
  • 打赏
  • 举报
回复
推荐几个网页你去看看,不知道你看过没:
1,[C#基础概念二十五问]http://www.cnblogs.com/reonlyrun/archive/2007/04/05/csharp_25_question.html
2,[-虚函数表示函数是以间接的方式被调用,而不是由一个固定的函数入口地址来调用,一个函数调用可以对应不同的函数入口地址。
-虚函数除了不能作为内联函数外,它遵循普通成员函数的所有语法规则。
-函数声明语法:virtual return_type name( arguments );
-在函数的定义部分和它的派生类的声明部分无需重复使用virtual关键字,它的所有派生类都保持virtual类型。
-把函数转变为虚函数的作用是为了配合通过基类指针访问某一对象的操作。
-如果在派生类里没有对某一函数进行重载,也就不必把此函数声明成虚函数。在进行函数调用时,虚函数的表现要略逊于普通函数,而且它也比代码相同的实函数占据较多的内存空间。]
http://zhidao.baidu.com/question/12336086.html
3,[百度百科]http://baike.baidu.com/view/161302.htm
...........................共同学习啊~~都是找的!
jiatong1981 2007-07-12
  • 打赏
  • 举报
回复
嗯?ls回答的话语 貌似是我回答人家的……
xiaoxiong87437624 2007-07-12
  • 打赏
  • 举报
回复
x =1 y =0



new B()后首先执行

int x=1;

int y;

再执行B的构造函数时会调用基类构造函数先 于是执行

public A()

{

PrintFields();

}

而A中的PrintFields方法是virtual方法且B中已经用override关键字实现了该方法 于是会执行子类B中的PrintFields方法 Console.WriteLine("x={0},y={1}",x,y); //注意此时还没有执行到B的构造函数 所以 y值为0



而后才执行到B的构造函数//此时 x=1 y =-1;
jjhlover 2007-07-01
  • 打赏
  • 举报
回复
实验结果 

x=1,y=0
xiaoliangwh 2007-06-30
  • 打赏
  • 举报
回复
up
Cwx_Rlin 2007-06-30
  • 打赏
  • 举报
回复
新菜鳥---正以堅硬無比的鋁鈦合金都黯然失色的一柱擎天的精神學習C井 中~~~~
beckge 2007-06-28
  • 打赏
  • 举报
回复
脸红的对wuyazhe说:谢谢!
兔子-顾问 2007-06-28
  • 打赏
  • 举报
回复
没仔细看。真菜。
嗯。嗯。是(X=1,Y=0)
bqlhome 2007-06-28
  • 打赏
  • 举报
回复
(1)中的PrintFields是虚函数呀.
beckge 2007-06-28
  • 打赏
  • 举报
回复
没装.net!
lyk02520 2007-06-28
  • 打赏
  • 举报
回复
执行过程为2---1---3。。
输出为:X = 1,Y = 0;
因为Y在输出的时候并未被赋值。
兔子-顾问 2007-06-28
  • 打赏
  • 举报
回复
结果显而易见。什么都不做。
你干嘛不抄到编译器里。单步调试看看? ^_^
beckge 2007-06-28
  • 打赏
  • 举报
回复
那①中的构造函数
public A()
{
PrintFields();---------------------------①
}
不会输出吗?
bqlhome 2007-06-28
  • 打赏
  • 举报
回复
当使用new B()创建B的实例时,产生什么输出?

X=1, Y=0
beckge 2007-06-28
  • 打赏
  • 举报
回复
sorry!没看明白,你说的输出是?
dreamsflying 2007-06-28
  • 打赏
  • 举报
回复
答案是3的输出,顺序:2->1->3,所以输出是3的输出,执行PrintFields()
的时候,y=-1还没有执行,所以输出应该是X=1,Y=0

111,125

社区成员

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

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

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