日期:2014-05-19  浏览次数:21093 次

c# virtual 和 override 好像没用的呀
开发环境vs2005

class   a
{
      internal   virtual   void   am(){Console.Write( "am ");}
}
class   b   :   a
{
      internal   override   void   am(){Console.Write( "b.am ");}
}

-------------------------------------------------------

把virtual和override去掉,效果一样。

为什么呀?

------解决方案--------------------
你用 ((a)(new b())).am(); 就知道效果不一样了
------解决方案--------------------
当然不一样了~
------解决方案--------------------
加override关键字,重写基类的方法,有多态性
不加的话,默认是隐藏,相当于加了new关键字,无多态
------解决方案--------------------
不一样
.virtual表示的是可fu盖,而overrede是fu盖...
------解决方案--------------------
不懂别乱讲。
多看看书去吧!
------解决方案--------------------
b b1 = new b();
a a1 = b1;
a1.am();

你用这段代码实验下  结果应该不同
------解决方案--------------------
反汇编下就知道区别了:

不写 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的
------解决方案--------------------
你试试这个
a test1 = new a();
test1.am();
test1 = new b();
test1.am();
------解决方案--------------------
使用override修饰符主要用来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的名称。
不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。