假设有一个简单的类层次结构和一个使用派生类的状态对象;
struct base_class {
int Value;
base_class() { this->Value = 1; }
virtual void Func() { printf("Base\n"); };
};
struct derived_class : base_class {
int Value;
derived_class() { this->Value = 2; }
void Func() { printf("Derived\n"); }
};
struct state {
int a,b,c;
derived_class Object;
};
现在,让我们假设有一个分配器,它不知道类型,只返回 0 初始化的所需大小的分配块内存。
state *State = (state *)Allocate(sizeof(state));
现在,要正确初始化 vtable 指针,我们必须构造对象。我已经看到它通过放置新运算符完成。它似乎确实有效。
但是,我很感兴趣为什么如果我像这样构造状态对象
*State = {};
状态已完美初始化,我看到值设置为 1 和 2。但 _vfprt 为 0。即使我进入构造函数,this指针似乎已正确设置所有内容,_vfprt 指向正确的方法和所有内容。
但是当我从构造函数返回时,_vfprt 无法复制到 State 对象。其他一切都在那里。但 _vfprt 为 0;所以我只是想知道是否有一个特殊的神奇复制构造函数在使用 new() 运算符时被调用。如果有,我该如何使用它。
我在我的应用程序中到处使用这种初始化,老实说,为了支持一个小类而在所有地方添加新的位置是一件很痛苦的事。{} 调用更简洁(更短),它使分配调用更容易。如果无法完成这项工作,我可以接受。我只是对为什么在我们从构造函数返回后没有将 vtable 指针复制回来感到困惑。
如果有人能解释为什么会发生这种情况,那就太好了。谢谢!