SpaceCowboy предлагает идиоматический метод clone
, но упустил из виду три важных детали:
class Super
{
public:
virtual Super* clone() const { return new Super(*this); }
};
class Child: public Super
{
public:
virtual Child* clone() const { return new Child(*this); }
};
clone
- это метод const
clone
возвращает указатель на текущий класс, а не базовый класс
clone
возвращает копию текущего объекта
2-й очень важен, потому что он позволяет использовать преимущества из-за того, что иногда у вас есть больше информации о типе, чем просто Super*
.
Кроме того, я обычно предпочитаю clone
предоставить копию, а не просто новый объект того же типа. В противном случае вы используете шаблон Exemplar
для создания новых объектов, но клонирование выполняется неправильно, а имя вводит в заблуждение.