首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在编译时初始化vptr?

如何在编译时初始化vptr?
EN

Stack Overflow用户
提问于 2017-11-13 12:46:08
回答 1查看 507关注 0票数 2

以上是一个面试问题。

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

如何在编译时初始化vptr

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-13 12:52:04

严格地说,这不包括在C++标准中。但是有足够的实现来考虑这一点,这是一种普遍的智慧。我将只处理单个继承,因为多重继承要复杂得多。

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

代码语言:javascript
复制
this->_vptr = /*VTable's Address*/;

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

是的,这个任务自然是在运行时进行的。即使表本身可以预先填充。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47264695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档