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

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

Linda Hamilton
Libérer: 2024-11-30 21:51:19
original
472 Les gens l'ont consulté

How Does Slicing Affect Polymorphism in C  ?

Polymorphisme et découpage en C

En C, le polymorphisme vous permet de créer des objets avec différentes fonctionnalités en fonction de leur classe dérivée. Cependant, cela peut conduire à un comportement étrange s’il n’est pas traité avec précaution. L'un de ces problèmes est le « tranchage ».

Considérez le code suivant :

#include <iostream>
using namespace std;

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

class Dog : public Animal {
public:
    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 que vous obtenez est :

rawr
bark
rawr
bark
Copier après la connexion

Vous pourriez vous attendre à ce que le résultat soit "rawr aboiement aboiement aboiement", mais à la place, l'objet badDog se comporte comme un animal au lieu d'un chien. Ceci est dû au découpage.

Lorsque vous créez badDog en tant qu'Animal badDog = Dog(), vous découpez l'objet Dog en un Animal. Cela signifie que badDog ne contient que les parties du Dog qui font partie de la classe Animal, et toutes les fonctionnalités spécifiques du Dog sont perdues.

Pour résoudre ce problème, vous devez utiliser des pointeurs ou des références pour dériver des classes. Les pointeurs ou les références ne copient pas l'objet, ils peuvent donc conserver leur fonctionnalité spécifique. Par exemple, le pointeur goodDog conserve avec succès sa fonctionnalité Dog.

Certains langages comme Java ont une sémantique de référence par défaut, tandis que C utilise une sémantique de valeur. En C , vous devez explicitement utiliser des pointeurs ou des références pour obtenir une sémantique de référence. Ne pas le faire peut entraîner des problèmes de découpage, comme le démontre l'exemple badDog.

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