Abstract classes can override virtual members using abstract units:
public class B { public virtual void M() { } } public abstract class D : B { public abstract override void M(); } public abstract class D2 : D { public override void M() { } }
The sentence says that D2 should override void M() because it is declared an abstract in D If it was declared as D2 : B , this will be optional, but as it is, D2 must comply with the contracts specified in D , but M() will also behave like any other element overriding the "normal" virtual member, since M() is both virtual and abstract.
source share