Découpage d'objets dans le polymorphisme : stockage d'objets de classe dérivés dans des variables de classe de base
Lorsque l'on travaille avec l'héritage en C, on peut rencontrer le problème de découpage d'objet. Cela se produit lorsqu'un objet d'une classe dérivée est affecté à une variable de classe de base, entraînant la perte des membres spécifiques à la classe dérivée.
Considérez l'exemple suivant :
class Base { public: virtual void identify() { cout << "BASE" << endl; } }; class Derived : public Base { public: virtual void identify() { cout << "DERIVED" << endl; } }; int main() { Derived derived; vector<Base> vect; vect.push_back(derived); vect[0].identify(); return 0; }
Dans cet exemple code, nous nous attendons à ce que la méthode identifier() imprime "DERIVED" puisqu'il s'agit d'une méthode virtuelle. Cependant, il imprime "BASE" à la place. En effet, l'objet dérivé est découpé lorsqu'il est stocké dans le vecteur vect, qui est déclaré contenir les objets de base.
Pour résoudre ce problème et maintenir un comportement polymorphe, il faut stocker un pointeur vers la classe de base dans le vecteur. au lieu de l'objet lui-même :
vector<Base*> vect; vect.push_back(&derived); vect[0]->identify();
Maintenant, vect[0] pointe vers un objet Derived, garantissant que la méthode identifier() de la classe dérivée est appelée et imprime "DERIVED".
Pour améliorer encore cette approche et éviter la gestion manuelle de la mémoire, des pointeurs intelligents peuvent être utilisés. Par exemple :
vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>()); vect[0]->identify();
Cette approche garantit que la mémoire de l'objet Derived est automatiquement gérée, ce qui rend le code plus efficace et moins sujet aux erreurs.
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!