Maison  >  Article  >  développement back-end  >  Le découpage d'objets affecte-t-il le polymorphisme dans les vecteurs C ?

Le découpage d'objets affecte-t-il le polymorphisme dans les vecteurs C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 05:50:02760parcourir

Does Object Slicing Affect Polymorphism in C   Vectors?

Vecteurs et polymorphisme en C

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 stocker des copies des références d’instructions, pas les références elles-mêmes. Cela signifie que lorsque l'objet Add est repoussé dans le vecteur, une copie de la référence est créée.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn