热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

高手帮详细解答下面试题

usingSystem;classA{publicA(){PrintFields();}publicvirtualvoidPrintFields(){}}
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

16 个解决方案

#1


汗。。自己看书去。。
这分明是书上的题目。。。

#2


x=1,y=-1
当类A在哪里起什么作用呢?
根本就没关系嘛

#3


该回复于2008-07-30 09:36:00被版主删除

#4


That is a bad exam question.

1. It is bad to call virtual function in the constructor, because the derived class could be not yet fully initialized.
2. Because the derived class is not yet fully initialzed ( y = -1 is not yet assigned ), calling the virtual function 
   gives you the 'wrong' answer.

#5


 你写个主函数调试一下
x=1,y=0 是因为 New B是 先要用A的构造函数
 所以就出现了上面的
x=1,y=-1是因为 用了B的构造函数

看看构造函数就知道了


 

#6



class A
{
   public A()
   {
      SaySomething();                  // new A() has no problem, but new B() will throw null reference exception. Bad!
   }
   public virtual void SaySomething()
   {
   }
}

class B
{
   Random rand;
   public B()
   {
      rand = new Random();
   }

   public virtual void SaySomething()
   {
      Console.WriteLine( "hi " + rand.Next() );
   }
}

#7


Correction to my previous post:

...

class B  : A
{
...

#8


new B!

#9


是类初始化顺序你没有高明白了
先是基类的构造函数,然后是继承类的构造函数
这里先是a的构造函数,调用PrintFields();,但是a的PrintFields();是虚拟的,什么都没有做,然后调用他的实现方法,就是b 的PrintFields();,显示x,y,这时候x是初始化为1,y没有初始化,默认0,所以显示x=1,y=0。
然后构造b,调用b的构造函数,把y初始化为-1.然后是 obj.PrintFields();这句,调用了b的PrintFields()方法,显示x和y,这是后x没有变,y在b的构造函数中赋值-1
所以显示的时候就是x=1,y=-1
执行结果是 X=1,Y=0;x= 1 y = -1 

#10


x=1,y=0


调用顺序
基类(A)构造函数 -> A PrintFields() (由于被Boverride,所以实际是调用B的PrintFields()) -> B构造函数

#11


这段代码的执行顺序如下?
using System; 
class A 

public A() 

PrintFields(); // 2

public virtual void PrintFields(){} 

class B:A 

int x=1; 
int y; 
public B() 

y=-1; /// 1.

public override void PrintFields() 

Console.WriteLine("x={0},y={1}",x,y); // 3.

首先是类B中的变量声明,X = 1,y是随机的,可能是0,也可能是别的,由编译器的不同而不同,
再次是执行B的构造函数,进而在执行A的构造函数,
在执行PrintFields函数,此时由于PrintFields是虚函数,而此时B中正好重载了这个函数,因此执行B找中的PrintFields函数。输出时X = 1,y由于没有初始化,此时不知道是什么值,因该是随机值,视编译器而定!!!C#的编译器应该会初始化为0.

#12


真乱,为什么面试题总是这么的糟糕?

#13


答案是 x=1,y=0,我说怎么也得不出LZ说的结果嘛,下面是我用的实验代码:

using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            B x = new B();
            int c = 20;
        }
    }

    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);
        }
    }
}


为何得到的是x=1,y=0,是因为在new B()的时候,首先要调用A的构造函数,然后再调用B自身的构造函数,当调用A的构造函数的时候,要执行PrintFields()方法,而PrintFields()方法是一个虚函数,而此时是在创建类B的实例,因此会调用类B中的PrintFields(),此时x=1,而y尚未赋值,默认值是0,因此在屏幕上打出 x=1,y=0 ,执行完成后,再调用类B的构造函数,只是给y赋了个值,执行结束.

#14


x= 1 y = -1 
主要是考你的理论基础和思路。

#15


y=-1没有用吗 ?

#16


x=1, y=0

y=-1是在调用base的构造函数之后运行的,之后就不会再调用PrintFields()方法了,所以LZ的答案不对。。。

推荐阅读
author-avatar
苏格拉没有底YI_670
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有