浅析继承关系中的方法调用

理解C#中方法调用机制:虚方法与非虚方法的区别
本文深入探讨了C#编程中方法调用的两种情况:非虚方法和虚方法。通过示例代码演示了父类对象指向子类实例时,方法调用的过程,并解释了虚方法如何根据对象的实际类型动态调用对应的方法。重点突出了虚方法在多态性实现中的关键作用。

我们首先来看一段代码:

 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 Father
11     {
12         public void SayHi()
13         {
14             Console.WriteLine("我是父类的SayHi方法~!");
15         }
16     }
17     class Son : Father
18     {
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 Father
11     {
12         public virtual void SayHi()
13         {
14             Console.WriteLine("我是父类的SayHi方法~!");
15         }
16     }
17     class Son : Father
18     {
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值