ECMA-334 C# Language Specification

17.1.1.1: Abstract classes

The abstract modifier is used to indicate that a class is incomplete and that it is intended to be used only as a base class. An abstract class differs from a non-abstract class in the following ways:

When a non-abstract class is derived from an abstract class, the non-abstract class must include actual implementations of all inherited abstract members, thereby overriding those abstract members. [Example: In the example
abstract class A  
{  
   public abstract void F();  
}  
abstract class B: A  
{  
   public void G() {}  
}  
class C: B  
{  
   public override void F() {  
      // actual implementation of F  
   }  
}  
the abstract class A introduces an abstract method F. Class B introduces an additional method G, but since it doesn't provide an implementation of F, B must also be declared abstract. Class C overrides F and provides an actual implementation. Since there are no abstract members in C, C is permitted (but not required) to be non-abstract. end example]