Under what circumstances would you create an inheritance relationship that includes Abstract Classes and Virtual functions? What is the advantage of this type of design?
The abstract classes are used in order to define some behavior of the specific kind of the instances. The classic example of using the Abstract classes and Virtual Functions is the abstract class Shape and derived& classes Circle, Triangle, Square etc. Class Shape defines function "int FindArea()" for example, this function is virtual and is implemented in the derived classes. Every specific class has the specific implementation of this method. The advantage of this type of design is that we can create the collection of the Shape references and then add to this collection the objects of the derived classes. When we call the function FindArea(), it executes for the correct type of the object.
In C# we can do the same using the Interfaces.
Whe can also use such design to avoid the code duplication. For example we have two classes, DieselLocomotive and ElectricLocomotive. They have the identical functions (Drive(), Stop(), HitchWagons() and others) except the function GetEnergy(). Instead of implementing two different classes with the almost identical functions we can create the abstract class Locomotive and implement all identical functions and the virtual function GetEnergy(). Then create two derived classes,& DieselLocomotive and ElectricLocomotive, extend& Locomotive and implement GetEnergy().