Can I pass a pointer to a superclass, but create a copy of the child?
I have a function that takes a pointer to a superclass and performs operations on it. However, at some point, the f开发者_JAVA技巧unction 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.
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); }
};
clone
is aconst
methodclone
returns a pointer to the current class, not the base classclone
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.
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)
精彩评论