inheritance - Virtual functions in C# -


public class base1 {     public virtual void f()     {         console.writeline("base1.f()");     } }  public class derived1 : base1 {     // hides base1.f() because 'override' not specified     public new virtual void f()     {         console.writeline("derived1.f()");     } }  public class derived2 : derived1 {     // overrides derived1.f()     public override void f()     {         console.writeline("derived2.f()");          // call base method         base.f();     } }  class program {     static void main(string[] args)         base1 ob1 = new derived1();         ob1.f();          base1 ob2 = new derived2();         ob2.f();          derived1 ob3 = new derived2();         ob3.f();          derived2 ob4 = new derived2();         ob4.f();     } }   // calls derived2.f() because derived2 overrides derived1().f()         derived1 ob3 = new derived2();         ob3.f(); 

it expecting

base1 ob2 = new derived2(); ob2.f(); 
  1. the derived2 function called base class function called , reason this.
  2. does .net uses vtables

the method slot used static analysis during compilation depends on type of variable (or expression), not actual object. variable ob2 typed base1, base1 method slot used. , then correct override selected based on typed (essentially vtable on slot). base function used.

to use derived2 function, variable (or expression) must typed derived1 or subclass.


Comments