Découpage d'objets et polymorphisme dans des conteneurs vectoriels
Lorsqu'il s'agit d'héritage en C, il est parfois souhaitable de stocker les instances de classes dérivées dans des conteneurs comme les vecteurs. Cependant, l'approche simple consistant à utiliser un vecteur pour stocker les objets de la classe de base peut conduire à un découpage des objets, où les données dérivées spécifiques à la classe sont perdues.
Considérez le programme 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; }
Le le code crée un vecteur d'objets de base et stocke une instance de la classe Derived. Cependant, lors de l'appel de la méthode identifier() sur l'objet stocké, elle imprime « BASE » au lieu de « DERIVED ». En effet, le découpage d'objet se produit lorsque l'objet dérivé est affecté à l'élément vectoriel de base, ce qui entraîne la perte de données spécifiques dérivées.
Pour empêcher le découpage d'objet et préserver le comportement polymorphe, la solution préférée consiste à utiliser des pointeurs. pour baser les objets de classe dans le vecteur :
vector<Base*>
Cela garantit que les données dérivées spécifiques à la classe restent intactes. De plus, pour éviter la gestion manuelle de la mémoire, des pointeurs intelligents peuvent être utilisés :
vector<std::shared_ptr<Base>>
Les pointeurs intelligents assurent la gestion automatique de la mémoire via RAII (Resource Acquisition Is Initialization), ce qui en fait une approche plus robuste et conforme au C.
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!