究竟为什么编译器在运行时之前无法确定变量的真实类型?
Exactly why can compilers not determine a variable's true type until runtime?
我经常听说编译器在某些情况下无法确定要使用的方法的确切实现。以福克斯为例,我们可以想象一个场景(人们这么说),对于一个父类,其方法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 在传入该类型之前不知道该类型。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 激励'inline'说明符的真实世界示例?
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 理解在c++中的真实情况下类变量是如何存储在内存中的
- r 值的匿名变量对象与真实对象
- 究竟为什么编译器在运行时之前无法确定变量的真实类型?