我知道,对于具有虚拟功能的任何类或从具有虚拟功能的类派生的类,编译器都会做两件事。首先,它为该类创建一个虚拟表,其次,将虚拟指针(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++常见问题解答解释了到底发生了什么的要点。