如何在编译时初始化vptr?

Emp*_*ata 2 c++

以上是面试问题.

我理解,作为虚拟调度机制的一部分,编译器vTable为每个类创建一个并vptr在编译期间插入一个额外的指针().但究竟是什么时候将类的虚拟表分配给它vptr

如何vptr在编译时初始化?

无论我通过互联网阅读什么,都说编译器vptr在编译时初始化,但初始化是一种运行时机制.我错了吗?

我不明白编译器如何初始化它.

Sto*_*ica 6

严格来说,C++标准不涵盖这一点.但是有足够的实现可以考虑它的常识.我将仅解决单继承,因为多继承更复杂.

编译器事先知道类型的虚函数表所在的位置(它是分配它的编译器).它也知道所有类类型的构造函数.所以它必须做的很简单,在每个构造函数的开头,添加以下(说明性):

this->_vptr = /*VTable's Address*/;
Run Code Online (Sandbox Code Playgroud)

而已.这非常简单,甚至在重写时也能直观地工作.因为派生类的构造函数只会覆盖指针值.

是的,这项任务自然会在运行时发生.即使表本身可能预先填充.

  • 额外奖励:这与强制性的事实有关,即从构造函数调用的虚函数被调度到*current*类型,而不是最终派生的类型.构造函数从最少到大多数派生,每个构造函数依次覆盖vptr,并且它"正常工作". (4认同)