Maison > développement back-end > C++ > Pourquoi le découpage se produit-il dans le polymorphisme C et comment peut-il être évité ?

Pourquoi le découpage se produit-il dans le polymorphisme C et comment peut-il être évité ?

Patricia Arquette
Libérer: 2024-11-28 05:35:22
original
965 Les gens l'ont consulté

Why Does Slicing Occur in C   Polymorphism, and How Can It Be Avoided?

Polymorphisme et découpage en C : décoder la confusion

En C, le polymorphisme permet aux objets dérivés d'une classe de base de présenter différents comportements. Cependant, un piège courant, appelé « slicing », peut conduire à des résultats inattendus.

Question :

Considérez l'extrait de code suivant :

class Animal {
    virtual void makeSound() { cout << "rawr" << endl; }
};

class Dog : public Animal {
    virtual void makeSound() { cout << "bark" << endl; }
};

int main() {
    Animal animal;
    animal.makeSound();

    Dog dog;
    dog.makeSound();

    Animal badDog = Dog();
    badDog.makeSound();

    Animal* goodDog = new Dog();
    goodDog->makeSound();
}
Copier après la connexion

Le résultat est :

rawr
bark
rawr
bark
Copier après la connexion

Pourquoi le résultat de badDog ne s'imprime-t-il pas "écorce" ?

Réponse :

Ceci est un exemple de tranchage. Lorsque vous transmettez un objet Dog au constructeur Animal (comme dans badDog = Dog()), la partie Animal du Dog est copiée dans badDog. Cependant, comme badDog est de type Animal, il ne peut accéder qu'aux méthodes Animal, qui affichent par défaut "rawr".

Pour obtenir le polymorphisme, vous devez utiliser des pointeurs ou des références pour pointer vers l'objet de classe dérivé. Dans ce cas, goodDog est un pointeur vers un objet Dog, il peut donc accéder aux méthodes Dog et imprimer "aboiement".

Implications :

Le découpage en tranches peut conduire à comportements inattendus et est généralement déconseillé. L'utilisation de pointeurs ou de références garantit un comportement polymorphe approprié.

De plus, n'oubliez pas que C utilise la sémantique des valeurs par défaut, ce qui signifie que les variables contiennent les objets réels. Cela diffère de la sémantique de référence dans des langages comme Java et C#, où les variables contiennent des références à des objets.

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