不覆盖放置内存位置的 Placement New 替代方案

Alternative to Placement New that does not override placement memory location

我正在使用带虚函数的多态性,需要在使用前将指针定义为子对象类型。例如:

struct object {
  virtual void function() {}
};

struct object_child : object {
  int a;
  int b;
  void function() {std::cout<<"working";}
};

int main() {
  uint64_t sandbox[512];
  object * o1 = new ((void *) &sandbox[0]) object_child();
  o1->function();
}

这工作正常,除了该位置的内存被覆盖。是否有我可以使用的强制转换或某些运算符可以在不覆盖内存位置的情况下产生相同的 o1?

*** 编辑 - SK - 将 cout 添加到函数 -

0x20000处的字节匹配object_child的数据结构布局,但实际上没有。也就是说,您忽略了 object_child 有一个您没有考虑的不可见成员 - 虚函数指针。这意味着没有指针转换会起作用,期间。您必须创建一个 actual object_child 对象,它自己拥有该状态的副本。