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!