Le vecteur peut-il contenir des objets de classe dérivée en tant que variables de classe de base ?
En C, un problème déroutant se pose lorsque l'on tente de stocker des objets de classes dérivées dans des vecteurs dont les éléments sont du type classe de base. Comme dans l'exemple fourni :
#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; }
Au lieu d'imprimer "DERIVED" comme prévu en raison de l'envoi de la méthode virtuelle, ce code imprime "BASE". Ce comportement inhabituel provient du découpage d'objets.
Le coupable : le découpage d'objets
Le découpage d'objets fait référence à la perte de données dérivées spécifiques à une classe lorsque stocker une instance d'une classe dérivée dans une variable du type de classe de base. En effet, le compilateur copie uniquement la partie partagée des objets, en ignorant les membres dérivés spécifiques à la classe.
Une méthode alternative avec des pointeurs intelligents
Pour surmonter le découpage d'objets et obtenir un comportement polymorphe, la meilleure pratique consiste à stocker des pointeurs vers des objets de classe de base dans le vecteur. Cela élimine le découpage tout en préservant la nature dynamique des méthodes de classe dérivées.
vector<Base*> vect; vect.push_back(&derived); // Store a pointer to the Derived object
La méthode C : utilisation de pointeurs intelligents
Pour améliorer l'approche orientée objet, il est recommandé d'utiliser des pointeurs intelligents au lieu de pointeurs bruts. Les pointeurs intelligents gèrent automatiquement la gestion de la mémoire, garantissant un code sûr et propre.
#include <memory> vector<unique_ptr<Base>> vect; vect.push_back(make_unique<Derived>());
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!