Inheritance and Polymorphism in C# Step by step Implementation and Top 10 Questions and Answers
 Last Update: April 01, 2025      12 mins read      Difficulty-Level: beginner

Inheritance and Polymorphism in C#

Inheritance and polymorphism are two fundamental concepts in object-oriented programming (OOP) that allow for powerful code reuse and flexibility. C#, as a strongly-typed, object-oriented language, fully supports these concepts, making it a versatile choice for developing complex and scalable applications.


Inheritance

Inheritance allows a class to "inherit" fields and methods from another class, promoting code reuse and establishing a natural hierarchy. C# supports single inheritance, meaning a class can only inherit from one direct base class. However, through interfaces, a class can inherit from multiple "base interfaces," effectively simulating multiple inheritance.

Key Concepts:

  1. Base Class (Parent Class): This is the class whose properties and methods are inherited by another class.
  2. Derived Class (Child Class): This is the class that inherits the properties and methods of a base class.
  3. Access Modifiers: These control the visibility of base class members within derived classes (e.g., public, protected, private).
  4. Base Keyword: Used to access members of the base class from within the derived class, such as methods or constructors.

Example:

public class Animal
{
    public string Name { get; set; }

    public void Eat()
    {
        Console.WriteLine($"{Name} eats food");
    }

    public virtual void Speak()
    {
        Console.WriteLine($"{Name} makes a sound");
    }
}

public class Dog : Animal
{
    public new void Eat()  // Hides the base class Eat method
    {
        Console.WriteLine($"{Name} eats dog food"); // Overriding is done with the 'override' keyword for virtual methods
    }
 
    public override void Speak()
    {
        Console.WriteLine($"{Name} says Woof!");
    }
}

public class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine($"{Name} says Meow!");
    }
}

class Program
{
    static void Main()
    {
        Animal myAnimal = new Animal() { Name = "Generic Animal" };
        myAnimal.Speak(); // Output: Generic Animal makes a sound

        Dog myDog = new Dog() { Name = "Buddy" };
        myDog.Eat();   // Output: Buddy eats dog food
        myDog.Speak(); // Output: Buddy says Woof!

        Cat myCat = new Cat() { Name = "Whiskers" };
        myCat.Speak(); // Output: Whiskers says Meow!
    }
}

In this example, Animal is the base class with a Name property, an Eat method, and a Speak virtual method. The Dog class inherits from Animal and overrides the Speak method, providing specific behavior. It also provides a new Eat method that hides the base class's Eat method using the new keyword. The Cat class also inherits from Animal but only overrides the Speak method. In the Main method, instances of Dog and Cat demonstrate polymorphic behavior when calling the Speak method.


Polymorphism

Polymorphism is the ability of objects to take on many forms. In C#, polymorphism is primarily achieved through inheritance and interfaces. It allows for methods to be called on objects of unknown types, enabling dynamic method resolution at runtime.

Key Concepts:

  1. Method Overriding: This occurs when a derived class provides a specific implementation of a method that is already defined in its base class.
  2. Method Overloading: This occurs when multiple methods in the same class have the same name but different parameters (number or types).
  3. Virtual Methods: Defined using the virtual keyword in the base class and overridden using the override keyword in the derived class.
  4. Abstract Methods: Methods defined in an abstract class without an implementation; derived classes must provide an implementation.
  5. Interfaces: A contract that derived classes must fulfill by implementing all the interface's members.
  6. Object-Oriented Design Principles: Polymorphism helps implement principles like "open/closed" and "dependency inversion."

Example:

Continuing from the Animal example, let's further explore polymorphism, including method overloading:

public abstract class Creature
{
    public abstract void Breathe();
}

public class Amphibian : Creature
{
    public override void Breathe()
    {
        Console.WriteLine("Breathing through gills/lining of the mouth");
    }

    public void Breathe(string method)
    {
        Console.WriteLine($"Breathing through {method}");
    }
}

public class Human : Creature
{
    public override void Breathe()
    {
        Console.WriteLine("Breathing through lungs");
    }
}

class Program
{
    static void Main()
    {
        List<Creature> creatures = new List<Creature> 
        { 
            new Amphibian(), 
            new Human() 
        };

        foreach (Creature creature in creatures)
        {
            creature.Breathe();
        }

        Amphibian myAmphibian = new Amphibian();
        myAmphibian.Breathe(); // Calls the Breathe method with no parameters
        myAmphibian.Breathe("skin"); // Calls the overloaded Breathe method
    }
}

Here, Amphibian and Human both inherit from the abstract class Creature, which requires them to provide an implementation for the Breathe method. At runtime, the correct Breathe method is called based on the actual object type, demonstrating polymorphism. Additionally, Amphibian provides an overloaded Breathe method to illustrate method overloading.


Benefits of Inheritance and Polymorphism:

  • Code Reusability: Inheritance promotes code reuse by allowing derived classes to utilize existing functionality.
  • Maintainability: Changes in the base class can propagate to derived classes, simplifying maintenance.
  • Extensibility: New functionality can be added with minimal impact to existing code.
  • Flexibility: Polymorphism allows for more flexible and robust application designs by enabling dynamic method resolution.

In conclusion, inheritance and polymorphism are critical to building scalable and maintainable applications in C#. They facilitate organized, reusable, and manageable codebases, leveraging the power of object-oriented principles. Understanding and effectively utilizing these concepts will enhance your ability to write efficient, clean, and maintainable C# code.

Inheritance and Polymorphism in C# - Step-by-Step for Beginners

Understanding inheritance and polymorphism is fundamental to object-oriented programming in C#. These concepts allow you to create a more organized, modular, and reusable codebase. Inheritance lets you define a base class and then derive new classes from it, gaining its properties and methods. Polymorphism, on the other hand, allows methods to do different things based on the object it's acting upon. Here, we’ll walk you through setting up a simple application to illustrate these concepts step-by-step.

Step 1: Set Up Your Route

  1. Create a New Project:

    • Open Visual Studio.
    • Click on "Create a new project."
    • Select "Console App" and click "Next."
    • Name your project something like InheritancePolymorphismDemo and click "Create."
  2. Project Structure:

    • In the Solution Explorer, you will have Program.cs, which is the entry point of your application.

Step 2: Define the Base Class Using Inheritance

  1. Create a Folder for Classes:

    • In the Solution Explorer, right-click on the project name.
    • Select "Add" > "New Folder" and name it Classes.
  2. Create a Base Class:

    • Right-click on the Classes folder and select "Add" > "Class."
    • Name it Animal.cs.
  3. Define the Class:

    • In Animal.cs, add the following code:
      namespace InheritancePolymorphismDemo.Classes
      {
          public class Animal
          {
              public string Name { get; set; }
              public int Age { get; set; }
      
              public Animal(string name, int age)
              {
                  Name = name;
                  Age = age;
              }
      
              public virtual void Speak()
              {
                  Console.WriteLine("The animal makes a sound.");
              }
          }
      }
      

Step 3: Define Derived Classes

  1. Create a New Class for Dog:

    • Right-click on the Classes folder and select "Add" > "Class."
    • Name it Dog.cs.
  2. Define the Dog Class:

    • In Dog.cs, add the following code:
      namespace InheritancePolymorphismDemo.Classes
      {
          public class Dog : Animal
          {
              public string Breed { get; set; }
      
              public Dog(string name, int age, string breed) : base(name, age)
              {
                  Breed = breed;
              }
      
              public override void Speak()
              {
                  Console.WriteLine("The dog barks.");
              }
          }
      }
      
  3. Create a New Class for Cat:

    • Right-click on the Classes folder and select "Add" > "Class."
    • Name it Cat.cs.
  4. Define the Cat Class:

    • In Cat.cs, add the following code:
      namespace InheritancePolymorphismDemo.Classes
      {
          public class Cat : Animal
          {
              public string FavoriteToy { get; set; }
      
              public Cat(string name, int age, string favoriteToy) : base(name, age)
              {
                  FavoriteToy = favoriteToy;
              }
      
              public override void Speak()
              {
                  Console.WriteLine("The cat meows.");
              }
          }
      }
      

Step 4: Implement Polymorphism

  1. Modify Program.cs:
    • Open Program.cs and modify it to use your new classes and demonstrate polymorphism:
      using System;
      using InheritancePolymorphismDemo.Classes;
      
      namespace InheritancePolymorphismDemo
      {
          class Program
          {
              static void Main(string[] args)
              {
                  Animal myDog = new Dog("Buddy", 3, "Golden Retriever");
                  Animal myCat = new Cat("Whiskers", 5, "Mouse");
      
                  Console.WriteLine($"Name: {myDog.Name}, Age: {myDog.Age}, Breed: {(myDog as Dog).Breed}");
                  myDog.Speak();
      
                  Console.WriteLine($"Name: {myCat.Name}, Age: {myCat.Age}, Favorite Toy: {(myCat as Cat).FavoriteToy}");
                  myCat.Speak();
      
                  Console.ReadLine();
              }
          }
      }
      

Step 5: Run the Application and Observe Data Flow

  1. Build and Run:

    • Click on the "Start" button or press F5 to run your application.
    • The output in the console will be:
      Name: Buddy, Age: 3, Breed: Golden Retriever
      The dog barks.
      Name: Whiskers, Age: 5, Favorite Toy: Mouse
      The cat meows.
      
  2. Understanding the Data Flow:

    • You defined a base class Animal with a method Speak, which was overridden in Dog and Cat classes.
    • You created instances of Dog and Cat but stored them in variables of type Animal.
    • When the Speak method was called, the overridden method in the derived class was executed, demonstrating polymorphism.

Conclusion

By following these steps, you have successfully created a simple console application in C# that illustrates inheritance and polymorphism. Understanding these concepts well can greatly enhance your ability to write robust and scalable applications. You can now apply these principles to more complex scenarios and projects. Happy coding!