抽象类定义:
它的作用就是产生子类的同时给于子类一些特定的属性和方法。
abstract修饰符可以和类、方法、属性、索引器及事件一起使用。在类声明中使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

特性:
1.抽象类不能被实例化;
2.抽象类可以包含抽象方法和抽象访问器;
3.不能用sealed修饰符修改抽象类,这意味着抽象类不能被继承;
4.从抽象类派生的飞抽象类必须包括继承的所有抽象方法和抽象访问器的实现。

总结:
~抽象方法是隐式的虚方法;
~只容许在抽象类中使用抽象方法声明;
~因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号“{}”,实现由一个重方法提供,此重方法是非抽象类的成员;
~在抽象方法声明中使用static或virtual修饰符是错误的;
~除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样;
~在静态属性上使用absteact修饰符是错误的;

~在派生类中,通过包括使用override修饰符的属性声明,可以重写抽象的继承属性。 

  1. using System; 
  2. abstract class A 
  3.     public abstract void F(); 
  4.     protected int _x; 
  5.     public abstract int X 
  6.     { 
  7.         get
  8.         set
  9.     } 
  10. class B:A 
  11.     public override void F() 
  12.     { 
  13.          
  14.     } 
  15.     public override int X 
  16.     { 
  17.         get{return _x;} 
  18.         set{_x=value;} 
  19.     } 
  20. class Test 
  21.     static void Main() 
  22.     { 
  23.         B b=new B(); 
  24.         b.X=10; 
  25.         Console.Write(b.X); 
  26.     } 

 虚方法定义:
简单的说,虚方法就是可以被子类重写的方法,如果子类重写了虚方法,那么运行时将使用重写后的逻辑,如果没有重写,则使用父类中虚方法的逻辑;
virtual关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。 

  1. using   System   ;   
  2.     
  3.   class   A   
  4.     
  5.   {   
  6.     
  7.   public   void   F(   )   
  8.   {    
  9.       Console.WriteLine("A.F")   ;   
  10.   } 
  11.     
  12.   public   virtual   void   G(   )   
  13.   {   
  14.       Console.WriteLine("A.G")   ;    
  15.   } 
  16.     
  17.   }   
  18.     
  19.   class   B:   A   
  20.     
  21.   {   
  22.     
  23.   new   public   void   F(   )   
  24.   {    
  25.       Console.WriteLine("B.F")   ;   
  26.   } 
  27.     
  28.   public   override   void   G(   )   
  29.   {    
  30.       Console.WriteLine("B.G")   ;  
  31.   } 
  32.     
  33.   }   
  34.     
  35.   class   Test   
  36.     
  37.   {   
  38.     
  39.   static   void   Main(   )     
  40.     
  41.   {   
  42.   B   b   =   new   B(   )   ;   
  43.     
  44.   A   a   =   b;   
  45.     
  46.   a.F(   )   ;   
  47.     
  48.   b.F(   )   ;   
  49.     
  50.   a.G(   )   ;   
  51.     
  52.   b.G(   )   ;   
  53.     
  54.   }   
  55.     
  56.   }   
 输出是:A.F   B.F  B.G  B.G

 其实最重要的就是抽象方法不能实例化,要子类必须强制性的覆盖它的方法 。而虚方法则是提供了选择,可以覆盖可以不覆盖,继承基类中的虚方法。

总结比较如下:

抽象方法和虚方法的区别 :

 ~抽象方法和虚方法的区别在于:虚拟方法有一个实现部分,并为派生类提供了覆盖该方法的选项,相反,抽象方法没有提供实现部分,强制派生类覆盖方法(否则 派生类不能成为具体类);
~abstract方法只能在抽象类中声明,虚方法则不是;
~abstract方法必须在派生类中重写,而virtual则不必;
~abstract方法不能声明方法实体,虚方法则可以。

 另外说一下override修饰符

http://msdn.microsoft.com/zh-cn/library/ebca9ah3(v=vs.80).aspx

要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。

override 方法提供从基类继承的成员的新实现。通过 override 声明重写的方法称为重写基方法。