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();
- the derived2 function called base class function called , reason this.
- 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
Post a Comment