Инициализация VPTR так, что строитель не призывает

В пользу неких мотивов, у меня есть необходимость называть placement new на инстанции уже правильно созданная, но с Ваш VPTR неправильная. Я получил ее от файла, от socket... не имеет значения метод.

Это класс с функциями - членами virtual, а следовательно я нуждаюсь в том, чтобы призвать строителя инициализировать соответствующим образом VPTR.

Однако, строитель инициализирует все переменные - членов. Если бы это были примитивные данные, у него не было бы проблемы. Но они это не. У каких-то из переменных - членов есть его собственный строитель.

Я нашел решение... Называть строительный copy на самой инстанции!

#include 

struct Dato {
  int x = 0,
      y = 0;
};

struct Padre {
  Dato datos;

  virtual ~Padre( ) {
  }
};

struct Hija : public Padre {
};

int main( ) {
  Hija h;

  h.datos.x = 10;
  h.datos.y = 20;

  Hija *ptr = new ( &h ) Hija( h );

  std::cout << "x: " << ptr->datos.x << ", y: " << ptr->datos.y << '\n';

  return 0;
}

ejmplo доступен в Wandbox.

Полученный результат - искавший:

x: 10, и: 20

Вопросы:

  1. До тех пор, пока точка не является портативной это?

  2. Я понимаю, что осуществляется так называемый переиталик в различных подразумеваемых строителей. Есть другой метод, который предлагает тот же результат (инициализировать VPTR без sobrescribir оставшаяся часть памяти), препятствуя вышеупомянутым вызовам?

5
задан 27.03.2019, 09:18
0 ответов