首页 新闻 会员 周边

创建一个子类实例后,父类中被override的方法还分配内存入口地址吗

0
悬赏园豆:20 [已关闭问题]

如果存在,具体是怎么个过程?

kwgrun的主页 kwgrun | 初学一级 | 园豆:170
提问于:2009-08-25 10:44
< >
分享
其他回答(1)
0

应该不存在吧,入口只能有一个

斯克迪亚 | 园豆:4124 (老鸟四级) | 2009-08-25 11:12
可是在子类中使用base关键字还是能访问到该方法的啊
支持(0) 反对(0) kwgrun | 园豆:170 (初学一级) | 2009-08-25 11:20
0

虚拟函数是通过一个虚拟函数表来描述的,父类和子类的函数有不同的入口地址,调用时通过虚拟函数表来寻找父类有没有被重载的虚拟函数。所以虚拟函数重载时执行效率要低一些,因为有一个查表的过程。

eaglet | 园豆:17139 (专家六级) | 2009-08-25 11:30
很关键,是不是就是说当Father f=new Son();f调用方法时会先去属于父类对象的函数入口地址中查找,如果该方法在虚拟函数表中显示被重载,然后再去执行子类中重载的方法。而在Son s=new Son();中刚好倒过来,s调用方法会优先在属于子类对象的函数入口地址中查找,如果不存在该方法再去父类函数入口地址中查找(这段好像不妥)
支持(0) 反对(0) kwgrun | 园豆:170 (初学一级) | 2009-08-25 12:47
子类不需要查找父类的函数入口地址,因为子类调用函数就是调用其自身的那个函数,不存在在重装的问题。只有对象声明为父类时才需要到虚函数表中查找对应的子类重载函数的入口地址。 如果子类中调用 base.function 则直接调用父类的那个地址,这个地址不是动态查找的,而是编译器编译时就指定的,反过来父类调用子类重载的方法,编译器编译时无法知道,需要动态查找虚拟函数表。
支持(0) 反对(0) eaglet | 园豆:17139 (专家六级) | 2009-08-25 14:13
大侠有没有两篇这方面的文章,具体点的,比较原理的,谢了
支持(0) 反对(0) kwgrun | 园豆:170 (初学一级) | 2009-08-25 17:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册