Maison > développement back-end > C++ > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-02 05:50:02
original
759 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

ou

<code class="cpp">vector< std::reference_wrapper<Instruction> > ins;</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!