Maison > développement back-end > C++ > Le polymorphisme fonctionnera-t-il avec les références vectorielles en C ?

Le polymorphisme fonctionnera-t-il avec les références vectorielles en C ?

Barbara Streisand
Libérer: 2024-11-02 12:21:30
original
885 Les gens l'ont consulté

Will Polymorphism Work with Vector References in C  ?

Polymorphisme et références vectorielles en C

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

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

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, qui stocke les références aux objets au lieu des objets eux-mêmes. Cela peut être implémenté comme suit :

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

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!

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