博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析继承关系中的方法调用
阅读量:4650 次
发布时间:2019-06-09

本文共 1527 字,大约阅读时间需要 5 分钟。

我们首先来看一段代码:

1     class Program 2     { 3         static void Main(string[] args) 4         { 5             Father father=new Son(); 6             father.SayHi(); 7             Console.ReadKey(); 8         }    9     }10     class Father11     {12         public void SayHi()13         {14             Console.WriteLine("我是父类的SayHi方法~!");15         }16     }17     class Son : Father18     {19         public void SayHi()20         {21             Console.WriteLine("我是子类的SayHi方法~!");22         }23     }

再来看一下该段代码的运行结果:

这时不禁有人就会问:我们new出来的是子类对象,为什么调用的是父类的方法呢???
这就要从CLR的调用机制来解答了:
首先每个类型(Father,Son)都有自己的方法表,CLR在调用一个方法时,会判断这个方法是不是虚方法(下文将讲解虚方法的情况).如果不是虚方法,那么就去检查这个变量类型的方法表,找到了这个方法就执行它.
小结:
当父类对象指向子类实例时,即 Father father=new Son()时,父类和子类都存在SayHi方法(父类SayHi是非虚方法)时,当父类调用该方法时,即father.SayHi()时,调用的是父类的SayHi方法.

 

下面,我们来讲解父类中的方法是虚方法的情况,先看以下代码:

1     class Program 2     { 3         static void Main(string[] args) 4         { 5             Father father = new Son(); 6             father.SayHi(); 7             Console.ReadKey(); 8         } 9     }10     class Father11     {12         public virtual void SayHi()13         {14             Console.WriteLine("我是父类的SayHi方法~!");15         }16     }17     class Son : Father18     {19         public override void SayHi()20         {21             Console.WriteLine("我是子类的SayHi方法~!");22         }23     }

 

上面的代码运行结果是:

由此可见:

当父类调用的是虚方法,那么CLR会根据引用找到堆上的那个对象,根据对象的type pointer找到对象的真正类型(即GetType方法的返回类型),再调用该类型对应的方法,即子类的SayHi方法.

转载于:https://www.cnblogs.com/Derek-He/archive/2012/08/23/2652795.html

你可能感兴趣的文章