Lorsque vous travaillez avec des vecteurs et du polymorphisme en C , on peut rencontrer une situation où le type de l'objet stocké est crucial. Considérons l'exemple suivant :
<code class="cpp">struct Instruction { virtual void execute() { } }; struct Add : public Instruction { int a, b, c; Add(int x, int y, int z) { a = x; b = y; c = z; } void execute() { a = b + c; } }; vector<Instruction> v; Instruction* i = new Add(1, 2, 3); v.push_back(*i);</code>
Dans ce code, un vecteur d'objets de classe de base est créé et un objet d'une classe dérivée (Add) est poussé dans le vecteur comme référence. Le souci survient lors de l'accès à la fonction "execute" sur cet objet :
<code class="cpp">auto ins = v.back(); ins.execute(); // Will the object retain its Add type?</code>
Le polymorphisme fonctionnera-t-il ?
Non, ce ne sera pas le cas. Le vecteur stocke des valeurs, pas des références. Par conséquent, lorsque l'objet Add est poussé dans le vecteur, il sera copié, ce qui donnera un objet de type Instruction, pas Add.
Reference_wrapper
Pour garantir le le polymorphisme reste intact, une approche consiste à utiliser std::reference_wrapper
<code class="cpp">vector<std::reference_wrapper<Instruction>> ins;</code>
Prévenir les fuites de mémoire
De plus, le code alloue dynamiquement un objet Add avec new sans le supprimer, provoquant une fuite de mémoire . Pour remédier à cela, le code doit utiliser un pointeur intelligent, tel que std::unique_ptr, ou supprimer manuellement l'objet avant qu'il ne sorte de la portée.
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!