Могу ли я передать указатель на суперкласс, но создать копию дочернего? - PullRequest
3 голосов
/ 17 июня 2010

У меня есть функция, которая берет указатель на суперкласс и выполняет над ним операции. Однако в какой-то момент функция должна сделать глубокую копию введенного объекта. Есть ли способ, которым я могу выполнить такую ​​копию?

Мне пришло в голову сделать функцию шаблоном и просто передать пользователю тип, но я надеюсь, что C ++ предлагает более элегантное решение.

Ответы [ 2 ]

12 голосов
/ 17 июня 2010

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); }
};
  1. clone - это метод const
  2. clone возвращает указатель на текущий класс, а не базовый класс
  3. clone возвращает копию текущего объекта

2-й очень важен, потому что он позволяет использовать преимущества из-за того, что иногда у вас есть больше информации о типе, чем просто Super*.

Кроме того, я обычно предпочитаю clone предоставить копию, а не просто новый объект того же типа. В противном случае вы используете шаблон Exemplar для создания новых объектов, но клонирование выполняется неправильно, а имя вводит в заблуждение.

2 голосов
/ 17 июня 2010

Один пример, который я видел в wxWidgets, - это определение переопределенного метода «клон», чтобы в каждом классе вы могли сделать соответствующую глубокую копию, но метод возвращает копию как суперкласс.

(а затемтам где другие ответы с примерами)

...