我经常听说编译器在某些条件下无法确定要使用的方法的确切实现。Fox 的例子,我们可以想象一个场景(人们说),对于一个父类的方法 foo() 已经在子类中被覆盖,编译器现在不会调用 foo() 的哪个实现,直到运行时。因此,我们有了动态调度、vtables 等的概念。
我的问题是,究竟为什么编译器不能确定要调用的确切实现?我最近停下来思考它,我一直在努力证明它的合理性。也许我错过了一些非常明显的东西(当我听到答案时,我可能会踢自己)。仅仅是因为外部环境吗?如果是这样,那将如何发挥作用?
这是语言相关的限制还是手头有更基本的东西?