如何在编译时初始化vptr?

时间:2017-11-13 12:46:08

标签: c++

以上是面试问题。

据我所知,作为虚拟调度机制的一部分,编译器为每个类创建一个vTable,并在编译期间插入一个额外的指针(vptr)。但是,当它确切地分配班级'虚拟表到此vptr

vptr如何在编译时初始化?

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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