以上是一个面试问题。
我了解到,作为虚拟分派机制的一部分,编译器为每个类创建一个vTable,并在编译期间插入一个额外的指针(vptr)。但是它究竟是什么时候将类的虚拟表分配给这个vptr
如何在编译时初始化vptr?
无论我在互联网上读到什么,都说编译器在编译时初始化vptr,但是初始化是一种运行时机制。我说错了吗?
我不明白编译器如何初始化它。
发布于 2017-11-13 12:52:04
严格地说,这不包括在C++标准中。但是有足够的实现来考虑这一点,这是一种普遍的智慧。我将只处理单个继承,因为多重继承要复杂得多。
编译器预先知道类型的虚拟函数表位于哪里(分配它的是编译器)。它还知道该类类型的所有构造函数。因此,它所要做的非常简单,在每个构造函数的开头添加以下内容(说明性):
this->_vptr = /*VTable's Address*/;就这样。这非常简单,甚至在重写时可以直观地工作。因为派生类的构造函数只会覆盖指针值。
是的,这个任务自然是在运行时进行的。即使表本身可以预先填充。
https://stackoverflow.com/questions/47264695
复制相似问题