Maison  >  Article  >  développement back-end  >  Comment créer des instances de classe dérivées à partir de pointeurs de classe de base polymorphes ?

Comment créer des instances de classe dérivées à partir de pointeurs de classe de base polymorphes ?

DDD
DDDoriginal
2024-10-27 00:09:30517parcourir

 How to Create Derived Class Instances from Polymorphic Base Class Pointers?

Création d'instances de classe dérivées à partir de pointeurs de classe de base polymorphes

En programmation orientée objet, il est souvent nécessaire de copier ou de créer des instances de classes dérivées classes allant des pointeurs aux classes de base polymorphes. Cependant, cette opération peut être difficile lorsque plusieurs types dérivés existent.

L'approche naïve consistant à utiliser plusieurs typeids ou Dynamic_casts dans les instructions if pour vérifier chaque type, puis à utiliser new est inefficace et sujette aux erreurs. Une meilleure solution consiste à utiliser une méthode virtuelle dans la classe de base pour créer une copie.

Méthode Virtual clone()

En définissant un clone( ) dans la classe de base et en l'implémentant dans chaque classe dérivée, il est possible de créer dynamiquement une copie de l'instance de classe dérivée. La méthode clone() doit renvoyer un pointeur vers la copie nouvellement créée.

<code class="cpp">class Base {
  virtual ~Base();
  // Returns a dynamically created copy of this object
  virtual Base* clone() const = 0;
};</code>
<code class="cpp">class Derived1 : public Base {
  // Implements the clone() method for Derived1
  virtual Base* clone() const {
    return new Derived1(*this);
  }
};</code>
<code class="cpp">class Derived2 : public Base {
  // Implements the clone() method for Derived2
  virtual Base* clone() const {
    return new Derived2(*this);
  }
};</code>

En utilisant cette approche, vous pouvez créer une copie d'une instance de classe dérivée à partir d'un pointeur de classe de base comme suit :

<code class="cpp">Base* basePtr = new Derived1();
Base* copyPtr = basePtr->clone();</code>

Idiome CRTP pour une implémentation minimaliste

Pour éviter de dupliquer le code d'implémentation du clone() dans chaque classe dérivée, vous pouvez utiliser l'idiome CRTP (Curiously Recurring Template Pattern) :

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const {
    return new Derived(static_cast<const Derived&>(*this));
  }
};</code>
<code class="cpp">class Derived1 : public DerivationHelper<Derived1> {
  // Other members...
};</code>
<code class="cpp">class Derived2 : public DerivationHelper<Derived2> {
  // Other members...
};</code>

Cette approche implémente automatiquement la méthode clone() dans chaque classe dérivée tout en garantissant que le constructeur de copie est appelé pour le type correct.

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