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 en C ?

Patricia Arquette
Libérer: 2024-10-26 04:55:31
original
358 Les gens l'ont consulté

How to Create Copies of Derived Class Instances from Base Class Pointers in C  ?

Polymorphisme : création de copies d'instances de classe dérivées à partir de pointeurs de classe de base

Dans la programmation orientée objet, il est courant de rencontrer des scénarios où vous avez besoin pour créer des copies d'instances de classe dérivées tout en y accédant via des pointeurs vers leur classe de base polymorphe. Cette tâche peut être difficile, surtout lorsqu'on évite l'utilisation de bibliothèques externes ou de structures de code complexes.

Le problème :

Considérez la hiérarchie de classes suivante :

<code class="cpp">class Base {
  virtual ~Base();
};
class Derived1 : public Base { ... };
class Derived2 : public Base { ... };</code>
Copier après la connexion

L'objectif est de créer une méthode, CreateCopy(Base* base), qui renvoie une copie créée dynamiquement de l'instance pointée par base. Il est crucial d'éviter de renvoyer une référence à un objet temporaire pour éviter les erreurs d'exécution.

L'approche naïve :

Une approche naïve impliquerait l'utilisation de plusieurs typeids ou Dynamic_casts dans un série d'instructions if pour déterminer le type de classe dérivé spécifique, puis utiliser l'opérateur new pour créer une copie. Cependant, cette méthode est lourde et sujette aux erreurs.

Une meilleure approche :

Une solution plus élégante et plus polyvalente consiste à introduire une méthode virtuelle dans la classe de base :

<code class="cpp">class Base {
  virtual ~Base();
  virtual Base* clone() const = 0;
};</code>
Copier après la connexion

Chaque classe dérivée implémente ensuite sa propre méthode clone() pour créer une copie de l'instance.

CRTP (Curiously Recurring Template Pattern) :

Pour éviter de dupliquer l'implémentation de clone() dans chaque classe dérivée, vous pouvez exploiter l'idiome CRTP via une classe modèle :

<code class="cpp">template <class Derived>
class DerivationHelper : public Base {
public:
  virtual Base* clone() const {
    return new Derived(static_cast<const Derived&>(*this)); // call the copy ctor.
  }
};</code>
Copier après la connexion

Maintenant, les classes dérivées peuvent hériter de DerivationHelper au lieu de directement de Base :

<code class="cpp">class Derived1 : public DerivationHelper<Derived1> { ... };
class Derived2 : public DerivationHelper<Derived2> { ... };</code>
Copier après la connexion

Cette approche garantit que toutes les classes dérivées ont accès à la méthode clone() sans avoir besoin d'une implémentation manuelle dans chaque classe.

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!