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