Подтвердить что ты не робот

"новый оператор" для создания другого класса как factory?

Я пытаюсь использовать оператор new для создания экземпляра определенного класса, а не для ключевого слова new.

Я пытаюсь создать своего рода "factory" для абстрактного класса.

Мне кажется, что это невозможно, но позволяет дважды проверить! Этот код компилируется, но основной код рассматривает его как класс Test (а не TestImpl)

class Test
{
public:
  virtual int testCall() { return 0; };

  static void* operator new(std::size_t);
};

class TestImpl : public Test
{
  virtual int testCall() override
  {
    return i;
  }

  int i = 15;
};

void* Test::operator new(size_t sz)
{
  return ::new TestImpl();
}

void main()
{
  Test * t = new Test(); // Call the new operator, correctly
  int i = test->testCall(); // i == 0 and not 15
}
4b9b3361

Ответ 1

Обратите внимание, что для каждого нового выражения будут выполняться следующие два действия:

  • выделить память через соответствующий operator new.
  • построить объект в памяти, выделенной шагом # 1.

Итак, operator new выделяет память только, не создает объект. Это означает, что для Test * t = new Test(); будет построена еще Test в памяти, выделенной перегруженным operator new; даже вы построили TestImpl внутри operator new, но вскоре он будет перезаписан в той же памяти после завершения operator new.