CSharp - Virtual Function Members

Introduction

A function marked as virtual can be overridden by subclasses.

Methods, properties, indexers, and events can be virtual.

class Shape
{
       public string Name;
       public virtual decimal Thickness => 0;   // Expression-bodied property
}

(Thickness => 0 is a shortcut for { get { return 0; } }.

A subclass overrides a virtual method by applying the override modifier:

class Circle : Shape
{
       public long Radius;
}

class Square : Shape
{
       public decimal Width;
       public override decimal Thickness => Width;
}

By default, the Thickness of an Shape is 0.

A Circle does not need to specialize this behavior.

Square specializes the Thickness property to return the value of the Width:

Square mySquare = new Square { Name="McMySquare", Width=250000 };
Shape a = mySquare;
Console.WriteLine (mySquare.Thickness);  // 250000
Console.WriteLine (a.Thickness);         // 250000

The signatures, return types, and accessibility of the virtual and overridden methods must be identical.

An overridden method can call its base class implementation via the base keyword.