Maison > développement back-end > C++ > Comment puis-je éviter le découpage d'objets lors de l'utilisation de l'héritage avec des vecteurs C ?

Comment puis-je éviter le découpage d'objets lors de l'utilisation de l'héritage avec des vecteurs C ?

Susan Sarandon
Libérer: 2024-12-16 16:16:12
original
794 Les gens l'ont consulté

How Can I Avoid Object Slicing When Using Inheritance with C   Vectors?

Découpage d'objets et polymorphisme dans des conteneurs vectoriels

Lorsqu'il s'agit d'héritage en C, il est parfois souhaitable de stocker les instances de classes dérivées dans des conteneurs comme les vecteurs. Cependant, l'approche simple consistant à utiliser un vecteur pour stocker les objets de la classe de base peut conduire à un découpage des objets, où les données dérivées spécifiques à la classe sont perdues.

Considérez le programme suivant :

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

Le le code crée un vecteur d'objets de base et stocke une instance de la classe Derived. Cependant, lors de l'appel de la méthode identifier() sur l'objet stocké, elle imprime « BASE » au lieu de « DERIVED ». En effet, le découpage d'objet se produit lorsque l'objet dérivé est affecté à l'élément vectoriel de base, ce qui entraîne la perte de données spécifiques dérivées.

Pour empêcher le découpage d'objet et préserver le comportement polymorphe, la solution préférée consiste à utiliser des pointeurs. pour baser les objets de classe dans le vecteur :

vector<Base*>
Copier après la connexion

Cela garantit que les données dérivées spécifiques à la classe restent intactes. De plus, pour éviter la gestion manuelle de la mémoire, des pointeurs intelligents peuvent être utilisés :

vector<std::shared_ptr<Base>>
Copier après la connexion

Les pointeurs intelligents assurent la gestion automatique de la mémoire via RAII (Resource Acquisition Is Initialization), ce qui en fait une approche plus robuste et conforme au C.

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