Maison > développement back-end > C++ > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-27 23:11:29
original
840 Les gens l'ont consulté

How to Create Copies of Derived Class Instances from Polymorphic Base Class Pointers: A Solution Using Virtual Clone Methods and 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));
  }
};
Copier après la connexion

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 :

  • Simplicité : Le code est concis et facile à mettre en œuvre.
  • Extensibilité : L'ajout de nouvelles classes dérivées ne ne nécessite pas de modification de la classe Base.
  • Performances : les appels de fonctions virtuelles sont relativement efficaces.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!