Comme l'a écrit Scott Myers, vous pouvez profiter d'une détente dans le type système de C++ pour déclarer clone() pour renvoyer un pointeur vers le type réel d'être déclaré: déclarationsQuelle est la meilleure signature pour clone() en C++?
class Base
{
virtual Base* clone() const = 0;
};
class Derived : public Base
{
virtual Derived* clone() const
};
Le compilateur détecte que clone() un pointeur sur le type de l'objet et permet à Derived de le surcharger pour renvoyer un pointeur sur derived.
Il serait souhaitable d'avoir clone() renvoie un pointeur intelligent qui implique le transfert de la sémantique de propriété, comme ce qui suit:
class Base
{
virtual std::auto_ptr<Base> clone() const = 0;
};
class Derived : public Base
{
virtual std::auto_ptr<Derived> clone() const;
};
Malheureusement, l'assouplissement des conventions ne s'applique pas aux pointeurs intelligents basé sur un modèle, et le compilateur n'autorisera pas le remplacement.
Ainsi, il semble que je suis parti avec deux options:
- Avez-clone() renvoie un pointeur « stupide », et le document que les clients sont responsables de l'élimination de celui-ci. Demandez à clone() de renvoyer un pointeur de base intelligent et demandez aux clients d'utiliser dynamic_cast pour les enregistrer dans un pointeur dérivé s'ils en ont besoin.
L'une de ces approches est-elle préférée? Ou y a-t-il un moyen pour moi de manger ma sémantique de transfert de propriété et d'avoir ma sécurité de type forte aussi?
En fait, ce qui a déclenché ce que je voulais dire - je pourrais appeler directement nouveau avec le constructeur de copie quand j'avais besoin de cette classe particulière. – JohnMcG