我知道,对于具有虚拟功能的任何类或从具有虚拟功能的类派生的类,编译器都会做两件事。首先,它为该类创建一个虚拟表,其次,将虚拟指针(vptr)放在对象的基本部分中。在运行时,将实例化该vptr并开始指向正确的vtable。

我的问题是,此vptr在实例化过程中的确切位置设置在哪里? vptr的这种分配是否发生在构造函数之前/之后的对象的构造函数内部?

最佳答案

这严格取决于实现。

对于大多数编译器,

编译器在每个构造函数的“成员初始化器”列表中初始化this-> __ vptr。

这个想法是使每个对象的v指针指向其类的v表,然后编译器为此生成隐藏代码并将其添加到构造函数代码中。就像是:

Base::Base(...arbitrary params...)
   : __vptr(&Base::__vtable[0])  ← supplied by the compiler, hidden from the programmer
 {

 }

This C++常见问题解答解释了到底发生了什么的要点。

09-07 03:49