究竟为什么编译器在运行时之前无法确定变量的真实类型?

Exactly why can compilers not determine a variable's true type until runtime?

本文关键字:变量 真实 类型 无法确定 编译器 为什么 运行时 究竟      更新时间:2023-10-16

我经常听说编译器在某些情况下无法确定要使用的方法的确切实现。以福克斯为例,我们可以想象一个场景(人们这么说),对于一个父类,其方法foo()已被子类覆盖,编译器现在不会调用foo()的哪个实现,直到运行时。因此,我们有动态调度、vtables 等概念。

我的问题是,为什么编译器无法确定要调用的确切实现?我最近停下来想一想,我一直在努力证明它的合理性。也许我错过了一些非常明显的东西(当我听到答案时,我可能会踢自己)。只是取决于外部环境吗?如果是这样,那究竟会如何发展?

这是一个依赖于语言的限制,还是手头有更基本的东西?

想一想:

class Base
{
public:
    virtual void some_virtual_method(){...}
};
class Derived: public Base
{
public:    
    void some_virtual_method() override{...}
};
int choice;
cin >> choice; // cannot know the value at compile time
Base* foo;
if(choice)
{
    foo = new Base;
}
else
{
    foo = new Derived;
}
foo->some_virtual_method();

编译器无法知道在编译时调用哪个some_virtual_method(),因为选择完全取决于用户输入。调度是通过函数虚拟表完成的,并且在运行时完成。

编译器与运行时没有任何关系,除了它准备实际运行的机器代码。

当对象是动态创建并具有多态属性时,并且函数获取超类类型的参数时,PROGRAM 在传入该类型之前不知道该类型。