Maison >développement back-end >C++ >Comment créer des copies d'instances de classe dérivées à partir de pointeurs de classe de base polymorphes : une solution utilisant les méthodes de clonage virtuel et CRTP
Copie d'instances de classe dérivées à partir de pointeurs de classe de base polymorphes
Pour beaucoup, cette énigme de programmation s'est avérée insaisissable. Explorons les complexités impliquées et découvrons une solution efficace.
Considérons le scénario suivant : vous avez des classes Base, Derived1, Derived2, etc., où les classes Derived héritent de Base. Étant donné un pointeur vers un objet Base, l'objectif est de créer une copie allouée dynamiquement de l'objet Derived sous-jacent, en évitant des problèmes tels que "l'adresse de retour d'un objet temporaire".
Traditionnellement, cela a été résolu par une litanie de typeids ou Dynamic_casts dans les instructions conditionnelles. Cependant, nous recherchons une solution plus élégante.
Méthode de clonage virtuel
La clé réside dans l'introduction d'une méthode de clone virtuel() dans la classe Base, implémentée pour chaque Derived taper. Cette méthode renvoie une copie de l'objet. Si Base n'est pas abstrait, vous pouvez invoquer son constructeur de copie, mais cette approche comporte le risque de découpage si elle n'est pas implémentée correctement dans les classes dérivées.
Idiome CRTP pour la réutilisation du code
Pour éviter la duplication de code, l'idiome CRTP (Curiously Recurring Template Pattern) peut être utilisé. Considérez le modèle générique suivant :
template <class Derived> class DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast<const Derived&>(*this)); } };
En utilisant ce modèle, plusieurs classes dérivées peuvent hériter de DerivationHelper et implémenter la méthode clone() à l'aide de leurs constructeurs de copie respectifs.
Implémentation et Avantages
Cette solution offre plusieurs avantages :
En adoptant la méthode virtual clone() et l'idiome CRTP, les programmeurs peuvent efficacement atteindre l'objectif souhaité. fonctionnalité sans avoir besoin d’approches alambiquées ou sujettes aux erreurs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!