views:

94

answers:

2

I have a function that takes a pointer to a superclass and performs operations on it. However, at some point, the function must make a deep copy of the inputted object. Is there any way I can perform such a copy?

It occurred to me to make the function a template function and simply have the user pass the type, but I hold out hope that C++ offers a more elegant solution.

+1  A: 

One example I've seen in wxWidgets is defining a overriden method 'clone' so that in each class you can make the appropriate deep copy but the method returns the copy as the superclass.

(and then there where other answers with examples)

Greg Domjan
+9  A: 

SpaceCowboy proposes the idiomatic clone method, but overlooked 3 crucial details:

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 is a const method
  2. clone returns a pointer to the current class, not the base class
  3. clone returns a copy of the current object

The 2nd is very important, because it allows use to benefit from the fact that sometimes you have more type information than just a Super*.

Also, I usually prefer clone to provide a copy, and not merely a new object of the same type. Otherwise you're using an Exemplar pattern to build new objects, but you're not cloning proper and the name is misleading.

Matthieu M.
+1 This is the correct answer.
Jon Purdy
Thank you for pointing those out.
Space_C0wb0y