Académique Documents
Professionnel Documents
Culture Documents
Polymorphisme
Sommaire
Chapitre 15 – Polymorphisme
Copyright
Copyright ©© 2017
2014, Siaka
2008 Fofana,
Pearson Laboratoire
Education, des Signaux
Inc. Publishing et Systèmes.
as Pearson Université FHB Côte d’Ivoire
Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
Polymorphisme Polymorphisme
Compatibilité de type dans une hiérchie d’héritage Compatibilité de type dans une hiérchie d’héritage
Type de compatibilité dans l’héritage
• Les classe d’un programme • On peut affecter un pointeur vers une classe dérivée à
peuvent fare partie d’une Animal un pointeur vers sa classe de base. Une autre manière
hiérarchie d’héritage de dire ceci:
Chat Chien
• Les classes plus basses • Un pointeur de la classe de base peut pointer vers les
dans la hiérachie sont des objets des classes dérivées
cas spéciaux de celle plus Animal *pA = new Chat;
haute dans la hiérarchie
Caniche
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
1
Programmation C++ 07/09/2017
Polymorphisme Polymorphisme
Compatibilité de type dans une hiérchie d’héritage Compatibilité de type dans une hiérchie d’héritage
Type de compatibilité dans l’héritage Conversion de type d’un pointeur sur la classe de base
• C++ utilise le type déclaré d’un pointeur pour déterminer
• L’affectation d’un pointeur vers la classe de base à un
pointeur vers une classe dérivée nécessite une conversion l’accès aux membres de l’objet pointé
(cast)
Animal *pA = new Chat; • Si un objet de la classe dérivée est pointé par un pointeur
Chat *pC;
pC = static_cast<Chat *>(pA);
de la classe de base tous les membres de la classe
dérivée peuvent ne pas être accessibles
• Le pointeur vers la classe de base doit déjà pointer vers un
objet de la classe dérivée pour que ceci fonctionne
• Il faut alors faire une conversion (cast) de type du pointeur
sur la classe de base en un pointeur de la classe dérivée
(via static_cast) pour pouvoir accéder aux membres
qui sont spécifiques à la classe dérivée
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
Polymorphisme Polymorphisme
Polymorphisme et fonctions membres virtual Polymorphisme et fonctions membres virtual
Polymorphisme
Caniche
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
2
Programmation C++ 07/09/2017
Polymorphisme Polymorphisme
Polymorphisme et fonctions membres virtual Polymorphisme et fonctions membres virtual
Polymorphisme Polymorphisme
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
Polymorphisme Polymorphisme
Polymorphisme et fonctions membres virtual Polymorphisme et fonctions membres virtual
Polymorphisme Polymorphisme
• Le code précédent n’est pas polymorphique: il se • Le code n’est pas polymorphique à cause de l’expression
comporte de la même manière avec Animal, Chien et
pA[k]->id()
Chat même si leurs types sont différents et ont
différentes versions de la fonction membre id()
le compilateur ne voit que le type du pointeur pA[k], qui
est un pointeur sur Animal
• Le code polymorphique devrait afficher "animal chien
chat" au lieu de "animal animal animal" • Le compilateur ne voit pas le type de l’objet réellement
pointé qui pourait être Animal ou Chien ou Chat
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
3
Programmation C++ 07/09/2017
Polymorphisme Polymorphisme
Polymorphisme et fonctions membres virtual Polymorphisme et fonctions membres virtual
Fonctions virtual Fonctions virtual
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
Polymorphisme Polymorphisme
Polymorphisme et fonctions membres virtual Polymorphisme et fonctions membres virtual
Fonctions virtual Liaisons de fonctions
Comment déclarer virtual une fonction membre:
• dans pA[k]->id(), le compilateur doit choisir la version
class Animal{ de id() à utiliser: Il y a différentes versions dans les
public: virtual void id(){cout << "animal";} classes Animal, Chien et Chat
}
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
4
Programmation C++ 07/09/2017
Polymorphisme Polymorphisme
Polymorphisme et fonctions membres virtual Polymorphisme et fonctions membres virtual
Liaison statique Liaison dynamique
• La liaison statique choisit la fonction dans la classe du • La liaison dynamique détermine la fonction à invoquer au
pointeur de la classe de base en ignorant toute autre moment de l’exécution
version dans la classe de l’objet réellement pointé
• On peut examiner la classe réelle de l’objet pointé et
choisir la version la plus spécifique de la fonction
• La liaison statique est réalisée au moment de la
compilation
• La liaison dynamique est utilisée pour faire la liaison des
fonctions virtual
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
Polymorphisme Polymorphisme
Classes de base abstraites et fonctions virtual pures Classes de base abstraites et fonctions virtual pures
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
5
Programmation C++ 07/09/2017
Polymorphisme Polymorphisme
Classes de base abstraites et fonctions virtual pures Classes de base abstraites et fonctions virtual pures
Fonctions abstraites Fonctions virtual pure
• Les fonctions membres spécifiées dans une classe • En C++, une fonction membre d’une classe est déclarée
abstraite n’ont pas besoin d’être implémentées être une fonction abstraite en la rendant virtual et en
remplacant le coprs par = 0;
class Animal{
• L’implémentation est laissée aux sous classes public:
virtual void id()=0;
};
• En C++, une classe abstraite est une classe avec au
moins une fonction membre abstraite • Une fonction virtual avec son corps omis et remplacé par
=0 est appelée fonction virtual pure ou une fonction
abstraite
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
Polymorphisme Polymorphisme
Classes de base abstraites et fonctions virtual pures Composition et héritage
Classes abstraites
• L’héritage modélise une relation 'est un' entre classes.
• Une classe abstraite ne peut pas être instanciée Un objet d’une classe dérivée est un objet de la classe
de base
• Une classe ne peut qu’être héritée; c’est à dire • Exemple:
qu’on ne peut qu’avoir des classes dérivées d’une
classe abstraite – un EtudiantEnLicence est un Etudiant
– un Mammifère est un Animal
• Les classes dérivée d’une classe abstraite doivent – une Caniche est un Chien
redéfinir toutes les fonctions virtual pures avant
de pouvoir être instanciées.
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley
6
Programmation C++ 07/09/2017
Polymorphisme
Composition et héritage
Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley