Virtual keyword can be used to start a new inheritance ladder

image_pdfimage_print
   
 

using System;

public class Class1 {
    public static void Main(string[] strings) {
        BankAccount ba = new BankAccount();
        Test1(ba);

        SavingsAccount sa = new SavingsAccount();
        Test1(sa);
        Test2(sa);

        SpecialSaleAccount ssa = new SpecialSaleAccount();
        Test1(ssa);
        Test2(ssa);
        Test3(ssa);

        SaleSpecialCustomer ssc = new SaleSpecialCustomer();
        Test1(ssc);
        Test2(ssc);
        Test3(ssc);
        Test4(ssc);
    }

    public static void Test1(BankAccount account) {
        Console.Write("to Test(BankAccount)");
        account.Withdrawal(100);
    }

    public static void Test2(SavingsAccount account) {
        Console.Write("to Test(SavingsAccount)");
        account.Withdrawal(100);
    }

    public static void Test3(SpecialSaleAccount account) {
        Console.Write("to Test(SpecialSaleAccount)");
        account.Withdrawal(100);
    }

    public static void Test4(SaleSpecialCustomer account) {
        Console.Write("to Test(SaleSpecialCustomer)");
        account.Withdrawal(100);
    }
}

public class BankAccount {
    virtual public void Withdrawal(double dWithdrawal) {
        Console.WriteLine(" invokes BankAccount.Withdrawal()");
    }
}

public class SavingsAccount : BankAccount {
    override public void Withdrawal(double dWithdrawal) {
        Console.WriteLine(" invokes SavingsAccount.Withdrawal()");
    }
}
public class SpecialSaleAccount : SavingsAccount {
    new virtual public void Withdrawal(double dWithdrawal) {
        Console.WriteLine(" invokes SpecialSaleAccount.Withdrawal()");
    }
}

public class SaleSpecialCustomer : SpecialSaleAccount {
    override public void Withdrawal(double dWithdrawal) {
        Console.WriteLine
          (" invokes SaleSpecialCustomer.Withdrawal()");
    }
}