我最近读过维基百科上的Dynamic Dispatch,无法理解C++中动态调度和后期绑定之间的区别.
当使用每种机制时?
来自维基百科的确切报价:
动态调度与后期绑定(也称为动态绑定)不同.在选择操作的上下文中,绑定是指将名称与操作相关联的过程.调度是指在确定名称引用的操作后选择操作的实现.使用动态分派时,名称可能在编译时绑定到多态操作,但是直到运行时才会选择实现(这是动态分派在C++中的工作方式).但是,后期绑定确实意味着动态调度,因为在选择了名称所引用的操作之前,您无法选择要选择的多态操作的哪个实现.
我最近遇到了两个重载问题,我找不到答案,也没有java环境来运行一些测试代码.我希望有人可以通过汇编一份java编译器遵循的所有规则列表来帮助我进行重载,或者交替指向我已经存在的列表.
首先,当两个方法只有最终的varargs参数不同时,在什么情况下每个方法都被调用,你可以在没有任何args的情况下调用varargs方法吗?
private void f(int a) { /* ... */ }
private void f(int a, int... b) { /* ... */ }
f(12); // calls the former? I would expect it to
f(12, (int[])null); // calls latter, but passes null for b?
// Can I force the compiler to call the second method in the same fashion
// as would happen if the first method didn't exist?
Run Code Online (Sandbox Code Playgroud)
第二个问题,当两个方法因为彼此继承而被调用的类型不同时?我希望调用最多的派生版本,并允许调用另一个版本.
interface A {}
class B implements A {}
class C implements A …Run Code Online (Sandbox Code Playgroud)