为了账号安全,请及时绑定邮箱和手机立即绑定

【求帮助】简短的C#代码,大家给个结果,解释下。

【求帮助】简短的C#代码,大家给个结果,解释下。

鸿蒙传说 2018-12-06 19:09:58
很简短的C#代码,如下: using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 直接调度测试{ class Program { public class Father { public void DoWork() { Console.WriteLine("Father.DoWork()"); } public virtual void DoVirtualWork() { Console.WriteLine("Father.DoVirtualWork()"); } } public class Son : Father { public new void DoWork() { Console.WriteLine("Son.DoWork()"); } public override void DoVirtualWork() { Console.WriteLine("Son.DoVirtualWork()"); } public static void DoStaticWork() { Console.WriteLine("Son.DoStaticWork()"); } } static void Main(string[] args) { Father son2 = new Son(); // son2.DoVirtualWork(); son2.DoWork(); } }} 程序的输出结果如下: Son.DoVirtualWork() Father.Dowork() 这里就有点迷糊了,哪位大侠给解释下,十万火急啊!!!!!!!!!!! 注:从CLR层面,肤浅的就不要了,谢谢!
查看完整描述

7 回答

?
森林海

TA贡献2011条经验 获得超2个赞

这答案谁告诉你的?有问题的。首先我觉得对方法表的理解有问题,每个类型都有自己的方法表,所以“Father类方法在方法表中位于Son方法的前面”这种说法有问题。CLR在调用一个方法时,已经知道这个方法是不是虚方法。如果不是虚方法,那么就去检查变量类型的method table,因此son2.DoWork()查找的是Father的MT(如果找不到那么会去基类里找),找到了就执行它(或者先JIT再执行)。如果是虚方法,那么会根据引用找到堆上的那个对象,根据对象的type pointer找到对象的真正类型(即GetType方法的返回类型),因此son2.DoVirtualWork()会直接查找Son的MT(如果找不到那么就去基类,这跟非虚方法是相同的)。你可以看看CLR VIA C#,里面讲的很清楚。

查看完整回答
反对 回复 2019-01-21
?
ibeautiful

TA贡献1993条经验 获得超5个赞

//基类型
Father son2 = new Son();

//首先 检查本类型(即Father)的方法DoVirtualWork,是不是虚或者抽象,如果不是//直接执行;如果是,再看子类(即Son)有没有重写,如果重写,则执行子类方法,如//果没有重写,执行本类型(即Father)的方法。
son2.DoVirtualWork();

//跟上面的规则一样
son2.DoWork();
查看完整回答
反对 回复 2019-01-21
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这个主要是new 和override的问题

new 是把父类的方法隐藏了,你把基类隐式转换成父类,调用的方法当然是父类的,因为是隐藏了,方法还在。

override 是把父类的方法重写,覆盖了,所以转换成父类的时候,还是看不见父类的方法,只能调用子类的。

查看完整回答
反对 回复 2019-01-21
?
大话西游666

TA贡献1817条经验 获得超14个赞

支持楼上

查看完整回答
反对 回复 2019-01-21
?
侃侃无极

TA贡献2051条经验 获得超10个赞

这个我也知道啊,可惜今天才看到啊,遗憾啊。。。

查看完整回答
反对 回复 2019-01-21
?
慕斯王

TA贡献1864条经验 获得超2个赞

学习了!

查看完整回答
反对 回复 2019-01-21
  • 7 回答
  • 0 关注
  • 296 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信