以上是一道面试题。
据我了解,作为虚拟分派(dispatch)机制的一部分,编译器会为每个类创建一个vTable
,并在编译期间插入一个额外的指针(vptr
)。但是它究竟是什么时候将类的虚拟表分配给这个 vptr
的呢?
vptr
是如何在编译时初始化的?
无论我在互联网上读到什么,编译器都会在编译时初始化 vptr
,但初始化是一种运行时机制。我错了吗?
我不明白编译器是如何初始化它的。
最佳答案
严格来说,这不在C++标准的涵盖范围之内。但是足够多的实现将其视为常识。我将只讨论单继承,因为多继承要复杂得多。
编译器预先知道类型的虚函数表位于何处(由编译器分配)。它还知道该类类型的所有构造函数。所以它要做的很简单,在每个构造函数的开头,添加以下内容(说明性的):
this->_vptr = /*VTable's Address*/;
就是这样。这非常简单,甚至在覆盖时也能直观地工作。因为派生类的构造函数只会覆盖指针值。
是的,该分配自然发生在运行时。即使表格本身可能已预先填充。
关于c++ - vptr 是如何在编译时初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47264695/