Copier des objets polymorphes en C
Lorsque vous travaillez avec des objets polymorphes, la création d'une copie complète de l'objet est souvent nécessaire. Cependant, les méthodes traditionnelles d'utilisation des constructeurs de copie et de surcharge de Operator= peuvent ne pas convenir lorsque le type de classe dérivé spécifique est inconnu au moment de la compilation.
L'approche de la méthode Clone
Une approche courante consiste à implémenter une méthode de clonage virtuel dans la classe de base. Chaque classe dérivée implémente ensuite sa propre version de Clone qui crée une nouvelle instance de la classe dérivée spécifique et copie les données membres.
Exemple :
class Base { public: virtual Base* Clone() = 0; }; class Derivedn : public Base { public: Derivedn* Clone() { Derivedn* ret = new Derivedn; copy all the data members return ret; } };
Types de retour covariant
Cependant, il existe une manière C plus idiomatique de gérer cela : le retour covariant genres. Cela permet aux classes dérivées de renvoyer un pointeur vers leur propre type à partir de la méthode Clone.
Exemple révisé :
class Base { public: virtual Base* Clone() = 0; }; class Derivedn : public Base { public: // Covariant return type, returns Derivedn* Derivedn* Clone() { return new Derivedn(*this); } private: Derivedn(const Derivedn&); // Copy constructor (possibly implicit or private) };
En utilisant des types de retour covariants, le constructeur de copie est utilisé implicitement pour créer la nouvelle instance de la classe dérivée. Cela simplifie la mise en œuvre et évite le besoin de copier explicitement les membres.
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!