Maison > développement back-end > C++ > Comment le découpage d'objets affecte-t-il le polymorphisme en C ?

Comment le découpage d'objets affecte-t-il le polymorphisme en C ?

Susan Sarandon
Libérer: 2024-12-17 11:20:27
original
413 Les gens l'ont consulté

How Does Object Slicing Affect Polymorphism in C  ?

Découpage d'objets dans le polymorphisme : stockage d'objets de classe dérivés dans des variables de classe de base

Lorsque l'on travaille avec l'héritage en C, on peut rencontrer le problème de découpage d'objet. Cela se produit lorsqu'un objet d'une classe dérivée est affecté à une variable de classe de base, entraînant la perte des membres spécifiques à la classe dérivée.

Considérez l'exemple 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

Dans cet exemple code, nous nous attendons à ce que la méthode identifier() imprime "DERIVED" puisqu'il s'agit d'une méthode virtuelle. Cependant, il imprime "BASE" à la place. En effet, l'objet dérivé est découpé lorsqu'il est stocké dans le vecteur vect, qui est déclaré contenir les objets de base.

Pour résoudre ce problème et maintenir un comportement polymorphe, il faut stocker un pointeur vers la classe de base dans le vecteur. au lieu de l'objet lui-même :

vector<Base*> vect;
vect.push_back(&derived);

vect[0]->identify();
Copier après la connexion

Maintenant, vect[0] pointe vers un objet Derived, garantissant que la méthode identifier() de la classe dérivée est appelée et imprime "DERIVED".

Pour améliorer encore cette approche et éviter la gestion manuelle de la mémoire, des pointeurs intelligents peuvent être utilisés. Par exemple :

vector<unique_ptr<Base>> vect;
vect.push_back(make_unique<Derived>());

vect[0]->identify();
Copier après la connexion

Cette approche garantit que la mémoire de l'objet Derived est automatiquement gérée, ce qui rend le code plus efficace et moins sujet aux erreurs.

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