name Test
{
class a
{
    virtual string Hello()
    {
        return "hello" ;
     }
}class b : a
{
    override string Hello()
    { 
         return "hello2000" ;
    }
}
static void Main(string[] args)
{
    a myClass = new b() ;
    Console.Write( myClass.Hello() ) ;
}   
}
运行结果会怎样!!!
不要测试,自己先猜一下............................

解决方案 »

  1.   

    hello2000
    我自己猜的找人来说说理由~~
      

  2.   

    a myClass = new b() ;
    隐式转换,不会改变内容
      

  3.   

    myClass 是B的一个实例,
    a myClass = new b() ;
    Console.Write( myClass.Hello() ) ;
    就相当于
    b myClass = new b() ;
    Console.Write( (a)myClass.Hello() ) ;
      

  4.   

    错了 应该是:
    myClass 是B的一个实例,
    a myClass = new b() ;
    Console.Write( myClass.Hello() ) ;
    就相当于
    b myClass = new b() ;
    Console.Write( ((a)myClass).Hello() ) ;
      

  5.   


    楼上的~~其实这是一个笔试的C#.net题目其中还有一个选项我没有说,
    那就是”不确定“具体输出是什么,是不确定~~
      

  6.   

    经过中断调试,程序执行过程显示如下
       a myClass = new b() ;
       class b : a
       {
          override string Hello()
          { 
             return "hello2000" ;
          }
        }
        Console.Write( myClass.Hello() ) ;----------------------------------
    执行结果:hello2000看来,NEW决定myClass是b的实例,楼主答案不正确
      

  7.   

    a myClass = new b();这句相当于隐式转换类型,对象本身没有变,如果是C++,则是其数据和函数指针表没有变
      

  8.   

    楼主能不能给出不是hello2000的情况?
      

  9.   

    我觉得可以这样理解。
    就像在.net中所有类都是Object类的子类。即使你装箱后仍然保存着原来类的数据结构。
    和这个题一样。因为在用new生成一个实例时,是b得实例。这个类的相关属性等就已经确定了。
    像这个例子中的隐式转换就相当于一个装箱的操作。
    下面是那个例子的IL代码:
    .method private hidebysig static void Main(string[] args) cil managed
    {
          .entrypoint
          // Code Size: 18 byte(s)
          .maxstack 1
          .locals (
                Test.b b1)
          L_0000: newobj instance void Test.b::.ctor()   创建b的实例
          L_0005: stloc.0 
          L_0006: ldloc.0 
          L_0007: callvirt instance string Test.a::Hello()  这里可以看到调用的是a的Hello()
          L_000c: call void [mscorlib]System.Console::Write(string)
          L_0011: ret 
    }
    这个市使用Reflector for .NET 反编译出来的 
      

  10.   

    如果这题类似脑筋急转弯的什么的,那答案就是编译通不过,否则这就是一个多态
    问题,不知道楼上的怎么会涉及到装箱?装箱是将值类型转换成引用类型时才会发生的操作。楼主有不是hello2000的情况吗?
      

  11.   

    还要这么复杂?n年前看BC3.1(一大厚本书哦),典型的迟后联编,多态性,好像差不多整个一章都是讲这个的
      

  12.   

    懂多态怎么回事的,就小拇指想都知道是hello2000啊。夸张了点。
      

  13.   

    不错,是hello2000,我也看出来了,哈哈
      

  14.   

    hello2000
    其实这个写法和
    object maClass=new b();
    是一个效果的,道理也相似。
    刚才写new b()一下想到-牛X,YY了。
      

  15.   

    override
    覆盖了,根本没执行a.Hello()
      

  16.   


    不相当于问System.Drawing.Brush brush=SystemBrushes.Control;brush 是什么类型?
      

  17.   

    返回第二个的吗return "hello2000" ;
      

  18.   

    如果不是 hello2000, 何来的策略模式?!