为什么在运行时调用虚函数需要虚表?

Why the need of virtual tables on calling virtual functions at runtime?

我一直在关注 this tutorial,试图了解 virtual table 以及 pointervirtual functions in C++ 背后的整个过程。

不确定,当我有这样的代码时:

D1 d1;
Base *dPtr = &d1;
dPtr->function1();

为什么我需要所有这些 virtual table 管理?为什么编译器根本不分配 d1 的内存地址(或基地址,如果没有的话)覆盖 virtual function?

我的意思是:如果它需要 D1 functon1() 地址或 Base functon1() 地址,它可以在编译时详细说明。那个时候就知道了。为什么稍后在运行时查看 virtual tables 会浪费时间和资源?

我想念这一点。想举个例子吗?

这是我的功能:

void foo(Base *pBase) {
  pBase->function1();
}

我单独编译,给你一个带头文件的目标文件。在您甚至梦想 D1 之前几个月。编译器怎么会"use the address of D1's function1 directly"这里?

不能。这就是为什么需要某种形式的间接寻址。

除此之外,虚函数 table 并不是 必需的 ,因为每个 C++ 实现都会使用虚函数。它只是当今编译器采用的最流行的实现技术。