Maison > développement back-end > C++ > Comment le polymorphisme et le découpage affectent-ils le comportement des objets en C ?

Comment le polymorphisme et le découpage affectent-ils le comportement des objets en C ?

Patricia Arquette
Libérer: 2024-12-02 05:20:09
original
723 Les gens l'ont consulté

How Does Polymorphism and Slicing Affect Object Behavior in C  ?

Polymorphisme et découpage en C

Lorsqu'ils traitent de l'héritage, les programmeurs C peuvent rencontrer le problème du découpage. 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

Ce code produit le résultat suivant :

rawr
bark
rawr
bark
Copier après la connexion

Cela peut être surprenant, car on pourrait s'attendre à ce que le résultat soit "rawr bark bark bark" à la place . La différence réside dans l'utilisation du découpage dans l'affectation badDog :

Animal badDog = Dog();
Copier après la connexion

Dans ce cas, les données du chien sont découpées dans l'objet Animal, entraînant une perte d'informations spécifiques au chien. En effet, Dog() crée un objet Dog, mais lors de son affectation à badDog, qui est un objet Animal, seule la partie Animal du Dog est copiée.

Pour éviter le découpage, on peut utiliser des pointeurs ou références :

Animal* badDogPtr = new Dog();
Animal& goodDogRef = dog;
Copier après la connexion

Les pointeurs et les références se comportent comme prévu et permettent un comportement polymorphe. En effet, ils font référence ou détiennent une référence à l'objet, plutôt que d'en avoir une copie comme dans le cas de la sémantique des valeurs.

Dans des langages comme Java et C#, la sémantique de référence est la valeur par défaut, tandis que dans C , la sémantique des valeurs est la valeur par défaut. Pour un comportement polymorphe en C , l'utilisation explicite de références ou de pointeurs est nécessaire.

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