Method hiding with new: what is printed? namespace CuriousTabConsoleApplication { class Baseclass { public void fun() { Console.Write("Base class "); } } class Derived1 : Baseclass { new void fun() { Console.Write("Derived1 class "); } } class Derived2 : Derived1 { new void fun() { Console.Write("Derived2 class "); } } class Program { static void Main(string[] args) { Derived2 d = new Derived2(); d.fun(); } } }
-
ABase class
-
BDerived1 class
-
CDerived2 class
-
DBase class Derived1 class
-
EBase class Derived1 class Derived2 class
Answer
Correct Answer: Derived2 class
Explanation
Introduction / Context:This problem illustrates method hiding using the new modifier in C#. Unlike virtual/override dispatch, new creates a new member that hides the inherited one when the compile-time type matches the derived class.
Given Data / Assumptions:
- Baseclass.fun, Derived1.fun, and Derived2.fun are all non-virtual and hidden with new.
- d is declared as Derived2 and instantiated as Derived2.
Concept / Approach:For non-virtual methods, the invoked method is selected based on the compile-time type of the reference. Because d has compile-time type Derived2, calling d.fun() invokes Derived2.fun(), printing “Derived2 class”. No base methods are called.
Step-by-Step Solution:
Determine compile-time type of d → Derived2.fun() in Derived2 hides fun() in Derived1 and Baseclass.Call d.fun() → Derived2.fun() executes → prints “Derived2 class”.Verification / Alternative check:Cast the reference to base types to observe different outputs: ((Derived1)d).fun() prints “Derived1 class” and ((Baseclass)d).fun() prints “Base class”.
Why Other Options Are Wrong:They assume virtual dispatch or concatenated prints which do not occur without calling base methods explicitly.
Common Pitfalls:Confusing new (hiding) with override (polymorphic override via virtual).
Final Answer:Derived2 class