首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++中的动态分派和后期绑定有什么不同?

C++中的动态分派和后期绑定有什么不同?
EN

Stack Overflow用户
提问于 2013-11-25 16:15:53
回答 11查看 27.7K关注 0票数 80

我最近在Wikipedia上读到了关于动态分派的文章,我无法理解C++中动态分派和后期绑定之间的区别。

当每一种机制都被使用时?

这是维基百科的原话:

动态调度不同于后期绑定(也称为动态绑定)。在选择操作的上下文中,绑定是指将名称与操作相关联的过程。调度是指在确定名称所指的操作之后,为操作选择一个实现。使用动态分派,名称可以在编译时绑定到多态操作,但直到运行时才能选择实现(这就是动态分派在C++中的工作方式)。但是,后期绑定确实意味着动态调度,因为在选择名称所引用的操作之前,您无法选择要选择的多态操作的实现。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2013-11-25 16:28:53

一个相当不错的答案实际上包含在一个关于programmers.stackexchange.com延迟绑定与早期绑定的问题中。

简而言之,后期绑定指的是eval的对象端,动态调度指的是函数端。在后期绑定中,变量的类型是运行时的变量。在动态调度中,正在执行的函数或子例程是变量。

在C++中,我们没有真正的后期绑定,因为类型是已知的(不一定是继承层次结构的末尾,但至少是一个正式的基类或接口)。但我们确实通过虚方法和多态性实现了动态分派。

对于后期绑定,我能提供的最佳示例是Visual Basic中的非类型化"object“。运行时环境会为您完成所有后期绑定的繁重工作。

代码语言:javascript
复制
Dim obj

- initialize object then..
obj.DoSomething()

编译器实际上将为运行时引擎编写适当的执行上下文,以执行名为DoSomething的方法的命名查找,如果使用正确匹配的参数发现该方法,则实际执行底层调用。实际上,对象的类型是已知的(它继承自IDispatch并支持GetIDsOfNames(),等等)。但是就语言而言,变量的类型在编译时是完全未知的,而且在运行时到达执行点之前,它甚至不知道DoSomething是否是obj的方法。

我不会转储C++虚拟接口等,因为我相信您已经知道它们是什么样子了。我希望很明显,C++语言根本不能做到这一点。它是强类型的。它可以(显然也确实)通过多态虚方法特性进行动态调度。

票数 75
EN

Stack Overflow用户

发布于 2013-11-25 16:32:31

后期绑定是在运行时按名称调用方法。除了从动态链接库导入方法之外,在c++中实际上并没有这样的功能。

一个这样的例子是:()

使用动态分派,编译器有足够的信息来调用方法的正确实现。这通常是通过创建来完成的。

票数 8
EN

Stack Overflow用户

发布于 2013-11-25 16:35:40

link本身解释了这种差异:

动态调度不同于后期绑定(也称为动态绑定)。在选择操作的上下文中,绑定是指将名称与操作相关联的过程。调度是指在确定名称所指的操作之后,为操作选择一个实现。

使用动态分派时,名称可以在编译时绑定到多态操作,但直到运行时才能选择实现(这就是动态分派在C++中的工作方式)。但是,后期绑定确实意味着动态调度,因为在选择名称所引用的操作之前,您无法选择要选择的多态操作的实现。

但在C++中,它们基本上是相等的,你可以通过虚函数和vtable进行动态调度。

C++使用早期绑定,并提供动态和静态分派。默认的派单形式是静态的。若要获得动态分派,必须将方法声明为虚拟的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20187587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档