虚方法:
1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.
2、virtual方法可以直接使用,和普通方法一样
3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写
virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别
相应的
sealed关键字标示此方法不可以被重写
虚方法和抽象方法的区别:
1.虚方法可以有实现体,抽象方法不能有实现体。
2.抽象方法
要求派生类必须重载这个方法;
虚方法
告诉编译器,这个方法可以重写。
当基类的方法与派生类的方法重名时,
可以选择派生类的方法从基类继承并重写,
还是,把基类的方法隐藏起来。
本段来自CSDN博客:http://blog.csdn.net/tflb521/archive/2009/08/20/4466134.aspx
当类中的方法声明前加上了virtual修饰符,我们称之为C#虚拟方法 ,反之为非虚。使用了virtual修饰符后,不允许再有static、abstract或override修饰符。对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。
下面的例子说明了C#虚拟方法与非虚方法的区别。
例子:
- using System;
- class A
- {
- public void F(){Console.WriteLine("A.F");}
- public virtual void G(){Console.WriteLine("A.G");}
- }
- class B:A
- {
- new public void F(){Console.WriteLine("B.F");}
- public override void G(){Console.WriteLine("B.G");}
- }
- class Test
- {
- static void Main()
- {
- B b=new B();
- A a=b;
- a.F();
- b.F();
- a.G();
- b.G();
- }
- }
例子中,A类提供了两个方法:非虚的F和C#虚拟方法 G.类B则提供了一个新的非虚的方法F,从而覆盖了继承的F;类B同时还重载了继承的方法G.那么输出应该是:
A.F
B.F
B.G
B.G
注意到本例中,方法a.G()实际调用了B.G,而不是A.G.这是因为编译时值为A,但运行时值为B,所以B完成了对方法的实际调用。