Maison > développement back-end > C++ > Comment éviter le découpage d'objets en C pour obtenir un comportement polymorphe ?

Comment éviter le découpage d'objets en C pour obtenir un comportement polymorphe ?

DDD
Libérer: 2024-12-26 04:33:10
original
430 Les gens l'ont consulté

How Can Object Slicing Be Avoided in C   to Achieve Polymorphic Behavior?

Découpage d'objets et comportement polymorphe

Dans la programmation orientée objet, le stockage d'objets de classe dérivés dans des variables de classe de base peut conduire à un comportement inattendu appelé découpage d'objet. Ce problème se produit lorsque la variable de classe de base se voit attribuer un objet d'une classe dérivée, ce qui entraîne la perte des membres spécifiques à la classe dérivée en raison du découpage de l'objet.

Exemple :

Considérons le programme suivant :

#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

Dans cet exemple, un objet de classe dérivé dérivé est stocké dans un vecteur d'objets de classe de base vect. Cependant, lors de l'appel de la méthode identifier() sur l'objet de classe de base vect[0], elle génère "BASE" au lieu du "DERIVED" attendu.

Solution :

Pour éviter le découpage d'objets et obtenir un comportement polymorphe, l'approche correcte consiste à stocker un pointeur vers la classe de base dans le fichier vecteur :

vector<Base*> vect;
Copier après la connexion

En utilisant un pointeur, les membres dérivés spécifiques à la classe sont préservés, permettant le comportement polymorphe souhaité.

Solution améliorée utilisant des pointeurs intelligents :

Pour assurer une bonne gestion de la mémoire, il est recommandé d'utiliser un pointeur intelligent adapté au lieu d'un brut pointeur :

vector<unique_ptr<Base>> vect;
Copier après la connexion

Cela garantit que la mémoire des objets de la classe de base est automatiquement gérée à l'aide de l'acquisition de ressources par initialisation (RAII), ce qui rend le code plus efficace et plus robuste.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal