Maison  >  Article  >  développement back-end  >  Comment créer des instances de classe dérivées à partir d'un pointeur de classe de base polymorphe : guide des méthodes de clonage et de l'idiome CRTP

Comment créer des instances de classe dérivées à partir d'un pointeur de classe de base polymorphe : guide des méthodes de clonage et de l'idiome CRTP

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 00:21:30126parcourir

How to Create Derived Class Instances from a Polymorphic Base Class Pointer:  A Guide to Clone Methods and the CRTP Idiom

Création d'instances de classe dérivée à partir d'un pointeur vers une classe de base polymorphe

Ce problème survient lors de la tentative de création d'une copie d'une instance de classe dérivée d'un pointeur vers sa classe de base polymorphe. Une approche naïve implique de nombreuses vérifications de type et conversions dynamiques, vérifiant chaque type dérivé potentiel et employant le nouvel opérateur. Cependant, une solution plus raffinée est disponible.

La clé est d'incorporer une méthode virtuelle, Base* clone() const = 0;, dans la classe de base. Chaque classe dérivée doit ensuite remplacer cette méthode pour créer un clone spécifique. Par exemple :

<code class="cpp">class Base {
  virtual ~Base();
  virtual Base* clone() const = 0;
};
class Derived1 : public Base {
  virtual Base* clone() const override { return new Derived1(*this); }
};
class Derived2 : public Base {
  virtual Base* clone() const override { return new Derived2(*this); }
};</code>

En appelant clone() sur le pointeur de base, vous pouvez obtenir une nouvelle instance de la classe dérivée spécifique. Cette approche simplifiée élimine le besoin de vérifications de type ou de conversions dynamiques, améliorant ainsi la clarté et l'efficacité du code.

Cependant, si vous souhaitez éviter la duplication de code, envisagez d'exploiter l'idiome CRTP (Curiously Recurring Template Pattern). Une classe modèle peut être définie comme suit :

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const override {
    return new Derived(static_cast<const Derived&>(*this));
  }
};

class Derived1 : public DerivationHelper<Derived1> { ... };
class Derived2 : public DerivationHelper<Derived2> { ... };</code>

Cette classe modèle, lorsqu'elle est héritée par les classes dérivées, fournit l'implémentation nécessaire pour la méthode clone(), éliminant ainsi le besoin de remplacements distincts dans chaque classe dérivée. .

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!

Déclaration:
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