Maison > développement back-end > C++ > Les vecteurs peuvent-ils contenir des objets de classe dérivés sans découpage d'objet ?

Les vecteurs peuvent-ils contenir des objets de classe dérivés sans découpage d'objet ?

Susan Sarandon
Libérer: 2024-12-27 02:27:10
original
496 Les gens l'ont consulté

Can Vectors Hold Derived Class Objects Without Object Slicing?

Le vecteur peut-il contenir des objets de classe dérivée en tant que variables de classe de base ?

En C, un problème déroutant se pose lorsque l'on tente de stocker des objets de classes dérivées dans des vecteurs dont les éléments sont du type classe de base. Comme dans l'exemple fourni :

#include <iostream>
#include <vector>
using namespace std;

class Base {
public:
    virtual void identify() { cout << "BASE" << endl; }
};

class Derived : public Base {
public:
    virtual void identify() { cout << "DERIVED" << endl; }
};

int main() {
    Derived derived;
    
    vector<Base> vect;
    vect.push_back(derived);
    
    vect[0].identify();
    return 0;
}
Copier après la connexion

Au lieu d'imprimer "DERIVED" comme prévu en raison de l'envoi de la méthode virtuelle, ce code imprime "BASE". Ce comportement inhabituel provient du découpage d'objets.

Le coupable : le découpage d'objets

Le découpage d'objets fait référence à la perte de données dérivées spécifiques à une classe lorsque stocker une instance d'une classe dérivée dans une variable du type de classe de base. En effet, le compilateur copie uniquement la partie partagée des objets, en ignorant les membres dérivés spécifiques à la classe.

Une méthode alternative avec des pointeurs intelligents

Pour surmonter le découpage d'objets et obtenir un comportement polymorphe, la meilleure pratique consiste à stocker des pointeurs vers des objets de classe de base dans le vecteur. Cela élimine le découpage tout en préservant la nature dynamique des méthodes de classe dérivées.

vector<Base*> vect;
vect.push_back(&derived); // Store a pointer to the Derived object
Copier après la connexion

La méthode C : utilisation de pointeurs intelligents

Pour améliorer l'approche orientée objet, il est recommandé d'utiliser des pointeurs intelligents au lieu de pointeurs bruts. Les pointeurs intelligents gèrent automatiquement la gestion de la mémoire, garantissant un code sûr et propre.

#include <memory>

vector<unique_ptr<Base>> vect;
vect.push_back(make_unique<Derived>());
Copier après la connexion

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