编译时如何初始化vptr?

空数据

以上是面试问题。

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

vptr在编译时如何初始化?

我在网上阅读的任何内容都说编译器vptr在编译时初始化,但是初始化是一种运行时机制。我错了吗?

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

讲故事的人-Unslander Monica

严格来说,这不是C ++标准所涵盖的。但是有足够的实现方式可以考虑这是常识。我将只解决单一继承问题,因为多重继承要复杂得多。

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

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

而已。这非常简单,甚至在覆盖时也可以直观地工作。因为派生类的构造函数将覆盖指针值。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章