开发环境vs2005class a
{
   internal virtual void am(){Console.Write("am");}
}
class b : a
{
   internal override void am(){Console.Write("b.am");}
}-------------------------------------------------------把virtual和override去掉,效果一样。为什么呀?

解决方案 »

  1.   

    你用 ((a)(new b())).am(); 就知道效果不一样了
      

  2.   

    加override关键字,重写基类的方法,有多态性
    不加的话,默认是隐藏,相当于加了new关键字,无多态
      

  3.   

    不一样
    .virtual表示的是可fu盖,而overrede是fu盖...
      

  4.   

    viena经过我做几个小例子,没有发现new 和 override的区别在哪里呀。就是重写方法的时候,重写的方法形参,要和被重写的方法形参相同。能举个小例子说明一下多态吗?
      

  5.   

    b b1 = new b();
    a a1 = b1;
    a1.am();你用这段代码实验下  结果应该不同
      

  6.   

    反汇编下就知道区别了:不写 override的情况下:类A的am方法
    .method public hidebysig newslot virtual 
            instance void  am() cil managed
    {
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "am  "
      IL_0006:  call       void [mscorlib]System.Console::Write(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method a::am类B的am方法
    .method public hidebysig instance void  am() cil managed
    {
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "b.am"
      IL_0006:  call       void [mscorlib]System.Console::Write(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method b::am
    比较下
    类a的方法 .method public hidebysig newslot virtual 
            instance void  am() cil managed
    类b的方法 .method public hidebysig instance void  am() cil managed发现没,b 的am方法完全把a的给覆盖了再看看加上override的:
    类a的am方法
    .method public hidebysig newslot virtual 
            instance void  am() cil managed
    {
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "am  "
      IL_0006:  call       void [mscorlib]System.Console::Write(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method a::am类b的am方法:
    .method public hidebysig virtual instance void 
            am() cil managed
    {
      // 代码大小       13 (0xd)
      .maxstack  8
      IL_0000:  nop
      IL_0001:  ldstr      "b.am"
      IL_0006:  call       void [mscorlib]System.Console::Write(string)
      IL_000b:  nop
      IL_000c:  ret
    } // end of method b::am
    看下现在b的方法:
    .method public hidebysig virtual instance void 
            am() cil managed发现什么没?现在是b的am方法也是virtual的。。说明它继承了a的方法并且把他重写了。
    所以区别就是:
    如果不加,类b的方法就会类a的方法隐藏掉。
    如果加上override,它会把继承类a的方法,并且把类a重写,那么b的am方法也成了viritual的
      

  7.   

    你试试这个
    a test1 = new a();
    test1.am();
    test1 = new b();
    test1.am();
      

  8.   

    windstoreb的am方法也成了viritual,有什么用处?我认为,override能做到的,new也能做到呀。有什么事情是override能做到的,而new做不到的吗?
      

  9.   

    使用override修饰符主要用来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的名称。
            不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。
    重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级修饰符。例如:虚方法为public的,重新方法也必须是public的。
            不能使用下列修饰符修改重写方法:
            new        static        virtual        abstract        重写属性声明必须指写与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或是重写的。要求:(三相同)
    1、方法名称相同
    2、参数列表相同
    3、返回值类型相同
    一句话,只需要重新写方法内部的内容!
    ,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已.以上内容转载自"中国教育人博客"
      

  10.   

    a _a = new b();
    _a.am();
    你看一下两种结果。