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

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

维基百科的确切引用:

最佳答案

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

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

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

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

Dim obj

- initialize object then..
obj.DoSomething()

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

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

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

10-14 23:57