Problème :
Considérez l'extrait de code C suivant :
<code class="cpp">class Instruction { public: virtual void execute() {} }; class Add: public Instruction { private: int a; int b; int c; public: Add(int x, int y, int z) { a=x; b=y; c=z; } void execute() { a = b + c; } };</code>
Un vecteur de références Instruction est créé, et un objet Add est ajouté au vecteur en repoussant sa valeur déréférencée :
<code class="cpp">vector<Instruction> v; Instruction* i = new Add(1,2,3); v.push_back(*i);</code>
Dans une autre classe, le dernier élément du vecteur est récupéré et le La méthode d'exécution est appelée :
<code class="cpp">Instruction ins = v.back(); ins.execute();</code>
Question :
La méthode d'exécution conservera-t-elle son type Add et le code s'exécutera-t-il correctement ?
Réponse :
Non, ce ne sera pas le cas.
Le vecteur
De plus, l'opérateur new est utilisé pour allouer de la mémoire à l'objet Add. Cependant, comme l'objet n'est pas supprimé, une fuite de mémoire se produit.
Pour implémenter correctement ce scénario, il faut utiliser un vecteur d'Instruction* ou std::reference_wrapper
<code class="cpp">vector<Instruction*> ins;</code>
ou
<code class="cpp">vector< std::reference_wrapper<Instruction> > ins;</code>
Remarque supplémentaire :
Le comportement décrit dans ce problème est connu sous le nom de découpage d'objet.
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!