Introduction
C# is an object-oriented language, which means it supports features like Encapsulation, Inheritance, and Polymorphism.
These features make your code reusable, maintainable, and scalable — especially in enterprise ASP.NET applications.
In this article, we’ll focus on:
1. What Is Inheritance?
Inheritance is the process by which one class (child or derived class) inherits the properties and methods of another class (parent or base class).
It helps in:
- Code reusability 
- Reducing duplication 
- Improving scalability 
Example (Simple)
class Employee
{
    public string Name;
    public double Salary;
    public void ShowDetails()
    {
        Console.WriteLine($"Name: {Name}, Salary: {Salary}");
    }
}
class Manager : Employee
{
    public string Department;
    public void ShowDepartment()
    {
        Console.WriteLine($"Department: {Department}");
    }
}
Here, Manager inherits all properties and methods from Employee.
So, you can access Name, Salary, and ShowDetails() directly from the Manager object.
2. What Is Polymorphism?
Polymorphism means “many forms”.
In C#, it allows the same method name to behave differently based on the object that calls it.
There are two types:
- Compile-time Polymorphism (Method Overloading) 
- Run-time Polymorphism (Method Overriding using - virtualand- override)
 
Example 1: Compile-time Polymorphism (Method Overloading)
class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
    public double Add(double a, double b)
    {
        return a + b;
    }
}
Here, both methods are named Add, but have different parameter types.
The compiler decides which one to call based on input — that’s compile-time polymorphism.
Example 2: Run-time Polymorphism (Method Overriding)
class Employee
{
    public virtual void DisplayRole()
    {
        Console.WriteLine("Employee: General Role");
    }
}
class Manager : Employee
{
    public override void DisplayRole()
    {
        Console.WriteLine("Manager: Oversees team performance");
    }
}
class Developer : Employee
{
    public override void DisplayRole()
    {
        Console.WriteLine("Developer: Writes and tests code");
    }
}
Here, the method DisplayRole() is overridden in each subclass.
Which version runs depends on the object type at runtime.
3. Real-Time Example in ASP.NET WebForms
Let’s see a working example in a web application.
We’ll build a simple page that displays different employee roles dynamically.
ASPX Page (InheritanceExample.aspx)
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="InheritanceExample.aspx.cs" Inherits="WebFormsDemo.InheritanceExample" %>
<!DOCTYPE html>
<html>
<head>
    <title>Inheritance and Polymorphism in ASP.NET C#</title>
</head>
<body>
    <h2>Understanding Inheritance and Polymorphism in C#</h2>
    <asp:DropDownList ID="ddlRole" runat="server">
        <asp:ListItem Text="Select Role" Value=""></asp:ListItem>
        <asp:ListItem Text="Manager" Value="Manager"></asp:ListItem>
        <asp:ListItem Text="Developer" Value="Developer"></asp:ListItem>
        <asp:ListItem Text="Tester" Value="Tester"></asp:ListItem>
    </asp:DropDownList>
    <asp:Button ID="btnShow" runat="server" Text="Show Role Description" OnClick="btnShow_Click" />
    <br /><br />
    <asp:Label ID="lblResult" runat="server" ForeColor="Blue"></asp:Label>
</body>
</html>
Code Behind (InheritanceExample.aspx.cs)
using System;
namespace WebFormsDemo
{
    // Base class
    public class Employee
    {
        public string Name { get; set; }
        public virtual string DisplayRole()
        {
            return "Employee: Works in the organization.";
        }
    }
    // Derived classes
    public class Manager : Employee
    {
        public override string DisplayRole()
        {
            return "Manager: Oversees team goals and performance.";
        }
    }
    public class Developer : Employee
    {
        public override string DisplayRole()
        {
            return "Developer: Builds and maintains applications.";
        }
    }
    public class Tester : Employee
    {
        public override string DisplayRole()
        {
            return "Tester: Ensures software quality and bug-free delivery.";
        }
    }
    public partial class InheritanceExample : System.Web.UI.Page
    {
        protected void btnShow_Click(object sender, EventArgs e)
        {
            string selectedRole = ddlRole.SelectedValue;
            Employee emp = null;
            switch (selectedRole)
            {
                case "Manager":
                    emp = new Manager();
                    break;
                case "Developer":
                    emp = new Developer();
                    break;
                case "Tester":
                    emp = new Tester();
                    break;
                default:
                    lblResult.Text = "Please select a valid role.";
                    return;
            }
            lblResult.Text = emp.DisplayRole();
        }
    }
}
Output Example
| Selected Role | Output | 
|---|
| Manager | Manager: Oversees team goals and performance. | 
| Developer | Developer: Builds and maintains applications. | 
| Tester | Tester: Ensures software quality and bug-free delivery. | 
4. Real-Time Use Cases in Enterprise Projects
| Scenario | Inheritance Use | Polymorphism Use | 
|---|
| Role-based dashboard | Base: User, Derived: Admin, Manager, Employee | Display different UI or permissions | 
| Payment Gateway | Base: Payment, Derived: CardPayment, UPIPayment | Execute specific payment logic dynamically | 
| Notification System | Base: Notification, Derived: Email, SMS, Push | Trigger different send mechanisms | 
| E-commerce Orders | Base: Order, Derived: OnlineOrder, StorePickupOrder | Override delivery or billing logic | 
Key Takeaways
- Inheritance → Enables code reusability 
- Polymorphism → Enables flexibility and extensibility 
- Real-life projects → Use both together for scalable architecture 
Conclusion
By mastering Inheritance and Polymorphism, you write cleaner and more maintainable C# code.
In ASP.NET WebForms, these concepts are invaluable for role-based features, modular architecture, and reusable logic across pages.