Découpage d'objets et comportement polymorphe
Dans la programmation orientée objet, le stockage d'objets de classe dérivés dans des variables de classe de base peut conduire à un comportement inattendu appelé découpage d'objet. Ce problème se produit lorsque la variable de classe de base se voit attribuer un objet d'une classe dérivée, ce qui entraîne la perte des membres spécifiques à la classe dérivée en raison du découpage de l'objet.
Exemple :
Considérons le programme suivant :
#include <iostream> #include <vector> using namespace std; 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, un objet de classe dérivé dérivé est stocké dans un vecteur d'objets de classe de base vect. Cependant, lors de l'appel de la méthode identifier() sur l'objet de classe de base vect[0], elle génère "BASE" au lieu du "DERIVED" attendu.
Solution :
Pour éviter le découpage d'objets et obtenir un comportement polymorphe, l'approche correcte consiste à stocker un pointeur vers la classe de base dans le fichier vecteur :
vector<Base*> vect;
En utilisant un pointeur, les membres dérivés spécifiques à la classe sont préservés, permettant le comportement polymorphe souhaité.
Solution améliorée utilisant des pointeurs intelligents :
Pour assurer une bonne gestion de la mémoire, il est recommandé d'utiliser un pointeur intelligent adapté au lieu d'un brut pointeur :
vector<unique_ptr<Base>> vect;
Cela garantit que la mémoire des objets de la classe de base est automatiquement gérée à l'aide de l'acquisition de ressources par initialisation (RAII), ce qui rend le code plus efficace et plus robuste.
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!