Как скопировать / создать экземпляр производного класса из указателя на полиморфный базовый класс?

Я долго боролся с этой проблемой, поэтому решил спросить здесь.

class Base {
  virtual ~Base();
};
class Derived1 : public Base { ... };
class Derived2 : public Base { ... };
...

// Copies the instance of derived class pointed by the *base pointer
Base* CreateCopy(Base* base);

Метод должен возвращать динамически созданную копию или по адресу как минимум сохранить объект в стеке в некоторой структуре данных, чтобы избежать проблемы «возврата адреса временной».

Наивный подход к реализации вышеупомянутого метода будет использовать несколько typeid s или dynamic_cast в серии операторов if, чтобы проверить каждый возможный производный тип, а затем использовать оператор новый . Есть ли какой-нибудь другой, лучший подход?

PS: Я знаю, что этой проблемы можно избежать с помощью умных указателей, но меня интересует минималистичный подход без кучи библиотек.

26
задан svick 7 July 2013 в 18:02
поделиться