gpt4 book ai didi

c++ - C++中的动态调度和后期绑定(bind)有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 12:11:00 25 4
gpt4 key购买 nike

我最近在 Wikipedia 上阅读了有关动态调度的信息。并且无法理解 C++ 中动态调度和后期绑定(bind)之间的区别。

什么时候使用每一种机制?

来自维基百科的准确引用:

Dynamic dispatch is different from late binding (also known as dynamic binding). In the context of selecting an operation, binding refers to the process of associating a name with an operation. Dispatching refers to choosing an implementation for the operation after you have decided which operation a name refers to. With dynamic dispatch, the name may be bound to a polymorphic operation at compile time, but the implementation not be chosen until runtime (this is how dynamic dispatch works in C++). However, late binding does imply dynamic dispatching since you cannot choose which implementation of a polymorphic operation to select until you have selected the operation that the name refers to.

最佳答案

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

简而言之,后期绑定(bind)指的是 eval 的 object 端,动态调度指的是功能端。在后期绑定(bind)中,变量的 type 是运行时的变体。在动态调度中,正在执行的函数或子程序是变体。

在 C++ 中,我们并没有真正的后期绑定(bind),因为类型是已知的(不一定是继承层次结构的末端,但至少是一个正式的基类或接口(interface))。但我们确实通过虚方法和多态进行动态调度。

我可以为后期绑定(bind)提供的最佳示例是 Visual Basic 中的无类型“对象”。运行时环境为您完成所有后期绑定(bind)繁重的工作。

Dim obj

- initialize object then..
obj.DoSomething()

编译器实际上会为运行时引擎编写适当的执行上下文,以执行名为 DoSomething 的方法的命名查找,如果发现具有正确匹配的参数,则实际执行底层调用。实际上,关于对象类型的东西是已知的(它继承自IDispatch并支持GetIDsOfNames()等)。但就 language 而言,变量的 type 在编译时是完全未知的,也不知道 DoSomething 是否是偶数任何 obj 实际上 的方法,直到运行时到达执行点。

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

关于c++ - C++中的动态调度和后期绑定(bind)有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20187587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com