c++ - vptr 是如何在编译时初始化的?

标签 c++

以上是一道面试题。

据我了解,作为虚拟分派(dispatch)机制的一部分,编译器会为每个类创建一个vTable,并在编译期间插入一个额外的指针(vptr)。但是它究竟是什么时候将类的虚拟表分配给这个 vptr 的呢?

vptr 是如何在编译时初始化的?

无论我在互联网上读到什么,编译器都会在编译时初始化 vptr,但初始化是一种运行时机制。我错了吗?

我不明白编译器是如何初始化它的。

最佳答案

严格来说,这不在C++标准的涵盖范围之内。但是足够多的实现将其视为常识。我将只讨论单继承,因为多继承要复杂得多。

编译器预先知道类型的虚函数表位于何处(由编译器分配)。它还知道该类类型的所有构造函数。所以它要做的很简单,在每个构造函数的开头,添加以下内容(说明性的):

this->_vptr = /*VTable's Address*/;

就是这样。这非常简单,甚至在覆盖时也能直观地工作。因为派生类的构造函数只会覆盖指针值。

是的,该分配自然发生在运行时。即使表格本身可能已预先填充。

关于c++ - vptr 是如何在编译时初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47264695/

相关文章:

C++ - 在另一个类中实例化对象时调用默认构造函数以外的构造函数

c++ - 在 linux 上将共享库与未解析的符号链接(symbolic link)

c++ - ICreateDevEnum 在 32 位上工作但在 64 位上失败

c++ - 为什么我程序中这个简单的部分让我震惊了两个多小时?

c++ - 在线程中访问 vector.front() 会导致运行时错误

c++ - h和hpp问题,包含顺序错误

c++ - 读取文件而不是将其作为参数传递

c++ - 将 LuaBridge 与指向内置类型的指针一起使用

c++ - Boost spirit 解析器属性类型不起作用。

c++ - 从文件中加载 const 命名空间变量值