gpt4 book ai didi

C++ 子构造函数和 VPTR

转载 作者:行者123 更新时间:2023-11-28 02:36:22 29 4
gpt4 key购买 nike

在许多资料中,书籍等都写着“不要在子类构造函数中调用 this->virtualFunction”,并且在一些资料中解释了为什么你不能这样做。因为目前根本没有创建构造类。因此,将从子构造函数调用的虚函数将是基类的函数。这意味着在该类的子构造函数主体 VPTR 中指向基 VTABLE。

所以我的问题是,
当子类的 VPTR 将被覆盖以在其虚拟表上寻址时,对象构造的时刻是什么时候?我猜某些自动生成的代码会在构造函数体末尾或构造函数体执行之后执行。

第二个问题是,
为什么在施工结束时覆盖 VPTR?也许它有一些重要的原因?为什么不能在开始的构造函数主体或构造基类之后重写 VPTR?

Child::Child() :
Base()
//<----- Why not here?
//members initialization
{
//<----- Why not here?
//code
}

最佳答案

In many sources, books etc. are written "don't call this->virtualFunction in child class constructor"

我对此表示怀疑。通常建议不要从 base 类构造函数调用虚函数,以避免在您希望它们调用最终覆盖而不是基类版本时产生混淆。如果它们在那里是纯虚拟的,那么您当然不能从基类中调用它们 - 这会产生未定义的行为。

在派生类的构造函数中,它们定义明确,可以满足您的期望。

So virtual function that will be called from child constructor will be function of base class.

不,在 child 的构造函数体内,动态类型是Child , 虚函数调用将使用 Child覆盖。

what is the moment in object construction when VPTR of child class will be overriden to address on it's virtual table?

在所有基类构造函数完成之后,在子类成员初始化之前。 Child成员函数,包括虚函数,可以从成员初始化器(但不是基类初始化器)或构造函数体中调用。

您需要小心地从成员初始化程序中调用它们,因为它们可能会访问未初始化的成员。但是在构造函数体内,所有的基础对象和成员都被初始化了,所以它们是很安全的。

why is VPTR overriden at the end of construction?

事实并非如此。它发生在您用 <----- Why not here? 指示的第一点.

关于C++ 子构造函数和 VPTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27296421/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com