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(); }
Le résultat que vous obtenez est :
rawr bark rawr bark
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!