我最近读过维基百科上的Dynamic Dispatch,无法理解C++中动态调度和后期绑定之间的区别.
当使用每种机制时?
来自维基百科的确切报价:
动态调度与后期绑定(也称为动态绑定)不同.在选择操作的上下文中,绑定是指将名称与操作相关联的过程.调度是指在确定名称引用的操作后选择操作的实现.使用动态分派时,名称可能在编译时绑定到多态操作,但是直到运行时才会选择实现(这是动态分派在C++中的工作方式).但是,后期绑定确实意味着动态调度,因为在选择了名称所引用的操作之前,您无法选择要选择的多态操作的哪个实现.
Who*_*aig 64
一个相当不错的答案实际上被纳入了一个关于programmers.stackexchange.com的晚期与早期绑定的问题.
简而言之,后期绑定是指eval 的对象侧,动态调度是指功能侧.在后期绑定中,变量的类型是运行时的变体.在动态分派中,正在执行的函数或子例程是变体.
在C++中,我们实际上没有后期绑定,因为类型是已知的(不一定是继承层次结构的末尾,但至少是正式的基类或接口).但我们确实通过虚拟方法和多态进行动态调度.
我可以为后期绑定提供的最好的例子是Visual Basic中的无类型"对象".运行时环境为您完成所有后期绑定繁重的工作.
Dim obj
- initialize object then..
obj.DoSomething()
Run Code Online (Sandbox Code Playgroud)
编译器实际上将为运行时引擎编写适当的执行上下文,以执行所调用方法的命名查找DoSomething,如果使用正确匹配的参数发现,则实际执行基础调用.实际上,关于对象类型的一些东西是已知的(它继承IDispatch并支持GetIDsOfNames()等).但至于语言来讲类型的变量是在编译时完全未知的,如果它不知道DoSomething,甚至无论什么方法obj实际上是直到运行时到达执行点.
我不会打扰转储C++虚拟接口et'al,因为我相信你已经知道它们的样子.我希望很明显,C++语言根本无法做到这一点.它是强类型的.它可以(并且显然)通过多态虚拟方法功能进行动态调度.
后期绑定在运行时期间按名称调用方法.除了从DLL导入方法之外,你在c ++中并没有这个.
一个例子是:GetProcAddress()
通过动态分派,编译器有足够的信息来调用方法的正确实现.这通常通过创建虚拟表来完成.
在C++中,两者都是相同的.
在C++中,有两种绑定:
动态绑定,因为它在运行时完成,也称为后期绑定,静态绑定有时称为早期绑定.
使用动态绑定,C++通过虚函数(或函数指针)支持运行时多态,并使用静态绑定,解析所有其他函数调用.
绑定是指将名称与操作相关联的过程.
这里的主要功能是函数参数,它们决定了在运行时调用哪些函数
调度是指在确定名称引用的操作后选择操作的实现.
根据参数匹配调度控制
http://en.wikipedia.org/wiki/Dynamic_dispatch
希望这能帮助你