日期:2014-05-18  浏览次数:20879 次

关于子类是如何调用父类的非虚函数的疑惑
在子类的方法表中只拷贝了父类的所有虚函数 这一点是看了一些资料知道的 
但是这样的话 子类它是如何调用父类的非虚函数的呢???  
我看到一些文章上是这么说的 “直接call 方法地址”
我比较愚昧 表示没有看懂啊  

我的理解是如果是虚函数和非虚函数的调用方式不同 虚函数的调用是在运行时的时候才会去查找方法表 实现动态绑定
非虚函数我就不是很清楚了 产生很多疑惑
这个“直接call 方法地址” 是什么时候完成关联的??? 运行时?编译时? 
说起编译时 大家别笑话我哈 我对“编译时”这个词不是很明白 这个编译时是指鼠标垫程序右击编译一下程序那个时候呢  
还是指程序运行后jit的即时编译呢?????

擦 基础太弱了 唉 求大虾指教啊


------解决方案--------------------
编译成IL的时候,这时候就可以确定元数据了。
------解决方案--------------------
方法的地址就一个,不会被复制的,call是编译期就编译好了
------解决方案--------------------
看一下IL会明白很多
------解决方案--------------------
第一次call方法的时候去元数据表查方法IL 然后JIT编译IL为本地代码 CLR再将元数据表中方法的调用地址改为编译后本地代码内存地址
探讨
引用:

方法的地址就一个,不会被复制的,call是编译期就编译好了

再问下 类型的方法表中的方法的方法地址 和直接call方法的方法地址 有不同之处吗

------解决方案--------------------
虚函数才可能有方法表……非虚函数的跳转是在编译的时候就确定的,没有在运行的时候查表。如果一个类seal了(也就是没有再派生的可能了),编译器也是可能在编译的时候确定虚函数跳转地址而不是给类实例对象一个虚函数表。