以上是面试问题.
我理解,作为虚拟调度机制的一部分,编译器vTable为每个类创建一个并vptr在编译期间插入一个额外的指针().但究竟是什么时候将类的虚拟表分配给它vptr?
如何vptr在编译时初始化?
无论我通过互联网阅读什么,都说编译器vptr在编译时初始化,但初始化是一种运行时机制.我错了吗?
我不明白编译器如何初始化它.
严格来说,C++标准不涵盖这一点.但是有足够的实现可以考虑它的常识.我将仅解决单继承,因为多继承更复杂.
编译器事先知道类型的虚函数表所在的位置(它是分配它的编译器).它也知道所有类类型的构造函数.所以它必须做的很简单,在每个构造函数的开头,添加以下(说明性):
this->_vptr = /*VTable's Address*/;
Run Code Online (Sandbox Code Playgroud)
而已.这非常简单,甚至在重写时也能直观地工作.因为派生类的构造函数只会覆盖指针值.
是的,这项任务自然会在运行时发生.即使表本身可能预先填充.
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |