动态绑定

目录导航

动态绑定定义

动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。

程序运行过程中,把函数(或过程)调用与响应调用所需要的代码相结合的过程称为动态绑定。

静态绑定与动态绑定

除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问。 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定。在计算机语言中有两种主要的绑定方式, 静态绑定和动态绑定。静态绑定发生于数据结构和数据结构间,程序执行之前。静态绑定发生于编译期,因此不能利用任何运行期的信息。它针对函数调用与函数的主体,或变量与内存中的区块。动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息。在 面向对象的代码中,动态绑定意味着决定哪个方法被调用或哪个属性被访问,将基于这个类本身而不基于访问范围。

C++中的动态绑定

定义:

动态绑定是将一个过程调用与相应代码链接起来的行为。是指与给定的过程调用相关联的代码,只有在运行期才可知的一种绑定,他是 多态实现的具体形式。

实现原理:

C++中,通过 基类的引用或指针调用 虚函数时,发生动态绑定。引用(或指针)既可以指向基类对象也可以指向 派生类对象,这一事实是动态绑定的关键。用引用(或指针)调用的虚函数在运行时确定,被调用的函数是引用(或指针)所指对象的实际类型所定义的。

C++中动态绑定是通过虚函数实现的。而虚函数是通过一张 虚函数表(virtual table)实现的。这个表中记录了虚函数的地址,解决继承、覆盖的问题,保证动态绑定时能够根据对象的实际类型调用正确的函数。

在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到 虚函数的 偏移量)。这意味着我们通过对象实例的地址得到这张虚函数表,然后就可以 遍历其中 函数指针,并调用相应的函数。

缺点:

1.动态绑定在 函数调用时需要在 虚函数表中查找,所以性能比 静态函数调用稍低。

2.通过 基类类型的指针访问 派生类自己的 虚函数将发生错误。

相关百科
返回顶部
产品求购 求购