码迷,mamicode.com
首页 > 其他好文 > 详细

早绑定和迟绑定技术的通俗分析

时间:2015-06-25 15:37:19      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:c++

概念:

早绑定指的是在编译阶段进行绑定

迟绑定指的是运行阶段绑定


例子:

Class Base

{

void fun(){}

}

Class Bind :Class Base

{

Void fun(){}

}

main()

{

Base base;

base->fun();

Bind *tmp;

tmp  = &base;

tmp->fun();

}


上面的例子说明大家一个是不是有语法问题,其实我是故意的,fun函数被覆盖了

先来说说base->fun();是怎么一个过程吧。


程序运行时创建了base对象,base->fun();算什么呢?

如果你理解成对象对调用了对象中的函数的话,那就变成运行时去找到函数了,那说好的早绑定呢?

c++编译时,base->fun()其实等价于fun(base),这样一看不就是函数地址吗!确实是函数地址,

这也间接说明了c++中的成员函数就是一个唯一全局地址,而对象就是一个被隐藏了的入参。


早绑定指的是在编译阶段就决定了如何调用,编译确定了调用地址,当然就确定了调用方式,所以说是早绑定。

tmp->fun为什么会调用Bind的fun函数,是因为c++通过函数名+变量类型+变量个数来唯一确定全局唯一函数。

这也是为什么c++函数的调用设计方式和c不一样的原因吧!


其实当你正在理解了早绑定技术,我认为自己也可以搞定迟绑定技术。

迟绑定就是用来解决多态特性的(多态特性这里不做说明)

迟绑定也就是说就算赋值了,也能正确的调用正确的函数。

c++的解决方案是:

当调用函数时检查到了一个特殊标记(virtual),就不直接调用地址了,就中base对象中取出一个vptr,

   vptr指向了虚表,这样就可以正确的找到函数进行调用了。也就是绕一下而且,

   当然说起来简单,实现这样的功能还是有难度的。


    替代的解决方案:

     直接把虚函数保存到对象中,检查到特殊标记(vitrual)时,直接得到函数地址进行调用,

当让我想的方案是不成熟了。只是为了说明迟绑定就是我们平常也经常会用到的技术,并

不是神秘的,特殊的,复杂的。

早绑定和迟绑定技术的通俗分析

标签:c++

原文地址:http://blog.csdn.net/zp752963831/article/details/46635885

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!