以上是面试问题。
我了解作为虚拟调度机制的一部分,编译器vTable
为每个类创建一个,并vptr
在编译期间插入一个额外的指针()。但是什么时候才将类的虚拟表分配给它vptr
呢?
vptr
在编译时如何初始化?
我在网上阅读的任何内容都说编译器vptr
在编译时初始化,但是初始化是一种运行时机制。我错了吗?
我不明白编译器将如何初始化它。
严格来说,这不是C ++标准所涵盖的。但是有足够的实现方式可以考虑这是常识。我将只解决单一继承问题,因为多重继承要复杂得多。
编译器预先知道类型的虚拟函数表的位置(由编译器为其分配)。它还知道该类类型的所有构造函数。因此,它要做的很简单,在每个构造函数的开头,添加以下内容(说明性):
this->_vptr = /*VTable's Address*/;
而已。这非常简单,甚至在覆盖时也可以直观地工作。因为派生类的构造函数将覆盖指针值。
是的,这种分配自然会在运行时发生。即使表本身可能是预先填充的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句