Vous êtes sur la page 1sur 7

Programmation C++ 07/09/2017

Polymorphisme
Sommaire
Chapitre 15 – Polymorphisme

Programmation C++ • Compatibilité de type dans une hiérarchie d’héritage


• Polymorphisme et fonctions membres virtual
• Classes de base abstraites et fonctions virtual pures
Par • Composition et héritage
Siaka Fofana
fsiaka@hotmail.com
Laboratoire des Signaux et Systèmes

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

• Code polymorphique: Code qui se comporte différemment


lorsqu’il agit sur des objets de types différents Animal
Considérons la hiérarchie
Animal, Chat, Chien où
• Fonctio membre virtual: Le mécanisme en C++ pour la
réalisation du polymorphisme chaque classe a sa propre Chat Chien
version de la fonction
membre id( )

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

class Animal{ • Considérons la collection des différents objet Animal


public: void id(){cout << "animal";}
Animal *pA[] = {new Animal, new Chien, new Chat};
}

class Chat : public Animal{ et le code qui l’accompagne


public: void id(){cout << "chat";}
} for(int k=0; k<3; k++)
pA[k]->id();
class Chien : public Animal{
public: void id(){cout << "chien";}
} • Ce code affiche: animal animal animal, ignorant les
versions plus spécifique de id() dans Chien et dans
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

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

Si les fonctions membres id()avait été déclarées virtual


alors le code
Déclarer une fonction virtual fera en sorte que le Animal *pA[] = {new Animal, new Dog,new Chat};
compilateur fasse une vérification du type de chaque for(int k=0; k<3; k++)
pA[k]->id();
objet pour voir s’il a défini une version plus spécifique
de la fonction virtual
afficherait animal dog cat

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
}

class Chat : public Animal{ • La liaison de fonction est le processus de détermination


public: virtual void id(){cout << "chat";} de la définition à utiliser pour une fonction lors d’un appel
}
particulier
class Chien : public Animal{
public: virtual void id(){cout << "chien";}
}
• Les alternatives sont les liaisons static et dynamic

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

• Les classes abstraites sont des outils organisationnels.


• Une classe abstraite est une classe qui ne contient aucun
Elles sont pratiques dans l’organisation des hierarchies
objet qui ne soit pas membre des sous classes (classes
d’héritage
dérivées)

• Les classes abstraites peuvent être utilisées pour spécifier


• Par exemple, dans la vie réelle, Animal est classe abstraite:
une interface qui doit être implémentées par toutes les
un animal peut être un chien, un chat ou un lion…
sous classes

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

• Lorsqu’on définit une nouvelle classe, on a:

• La composition qui est appropriée lorsque la nouvelle


classe utilise un objet d’une classe existante

• L’héritage qui est appropriée lorsque


– les objets de la nouvelle classe sont un sous ensemble
des objets de la classe existante, ou
– les objets de la nouvelle classe seront utilisés de la
même manière que les objets de la classe existante

Copyright
Copyright©©2014,
2017 2008 Fofana, Education,
SiakaPearson LaboratoireInc.
desPublishing
Signaux etasSystèmes. Université FHB Côte d’Ivoire
Pearson Addison-Wesley

Vous aimerez peut-être aussi