在许多资料中,书籍等都写着“不要在子类构造函数中调用 this->virtualFunction”,并且在一些资料中解释了为什么你不能这样做。因为在构建类的时刻根本没有创建。因此,将从子构造函数调用的虚函数将是基类的函数。这意味着在该类的子构造函数主体中,VPTR 指向基 VTABLE。
所以我的问题是,
当子类的 VPTR 被覆盖以在它的虚拟表上寻址时,对象构造的时刻是什么时候?我猜想一些自动生成的代码会在构造函数主体的末尾或在构造函数主体执行之后执行。
第二个问题是,
为什么在构建结束时会覆盖 VPTR?也许有一些重要的原因?为什么不能在开始构造函数体或构造基类之后覆盖 VPTR?
Child::Child() :
Base()
//<----- Why not here?
//members initialization
{
//<----- Why not here?
//code
}