C++ - chapitre 6 - héritage et polymorphisme

40
Du C au C++ - Découverte du paradigme objet Du C au C++ - Découverte du paradigme objet Florent DIEDLER

description

Ece Paris

Transcript of C++ - chapitre 6 - héritage et polymorphisme

Page 1: C++ - chapitre 6 - héritage et polymorphisme

Du C au C++ - Découverte du paradigme objetDu C au C++ - Découverte du paradigme objet

Florent DIEDLER

Page 2: C++ - chapitre 6 - héritage et polymorphisme

Sommaire

I. Du C au C++ : concepts, diagramme de classes et vocabulaire

II. Principales différences entre le C et le C++II. Principales différences entre le C et le C++

III. Classes et objets

IV. Conteneurs : vecteurs, piles et files

V. Pointeurs, références et surcharges

VI. Héritage et polymorphisme

Florent DIEDLER

Page 3: C++ - chapitre 6 - héritage et polymorphisme

Sommaire (détail)

� V. Héritage et polymorphisme

A. Concepts et vocabulaire

B. Héritage simple – ImplémentationB. Héritage simple – Implémentation

C. Héritage multiple – Implémentation

D. Polymorphisme

E. Classe abstraite

Florent DIEDLER

Page 4: C++ - chapitre 6 - héritage et polymorphisme

Objectifs

� Comprendre la notion d’héritage et de polymorphisme

Comprendre l’intérêt des classes abstraites� Comprendre l’intérêt des classes abstraites

� Implémenter ces notions en C++

Page 5: C++ - chapitre 6 - héritage et polymorphisme

Concepts et vocabulaire (1/3)

� Héritage = Relation de parenté entre deux classes

Classe mère = classe de base (ou super-classe)� Classe mère = classe de base (ou super-classe)

� Classe dérivée (fille) = classe spécialisée

Florent DIEDLER

Page 6: C++ - chapitre 6 - héritage et polymorphisme

Concepts et vocabulaire (2/3)� Concept fondamental avec exemple :

Florent DIEDLER

Page 7: C++ - chapitre 6 - héritage et polymorphisme

Concepts et vocabulaire (3/3)

� Classe dérivée (fille) hérite des attributs et méthodes de la classe mère

� Avantages :

�Factorisation du code

�Réutilisabilité

�Modularité

�Création d’interface…

Florent DIEDLER

Page 8: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple - Exemple (1/3)

� Classe « Person »

�Nom, age

� Clase « Student »

�Nom, age, promotion, notes

� Classe « Employee »

�Nom age, salaire, compétences

Florent DIEDLER

Page 9: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple - Exemple (2/3)

� Plusieurs classes (min. 2 classes)

� Attributs « nom » et « age » en commun !� Attributs « nom » et « age » en commun !

� Relation « est un »

RELATION D’HERITAGE

Florent DIEDLER

Page 10: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple - Exemple (3/3)

� Considérons le diagramme de classe :

Florent DIEDLER

Page 11: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (1/9)� Déclaration de la classe mère « Person » :

Florent DIEDLER

Page 12: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (2/9)� Implémentation de la classe mère « Person » :

Florent DIEDLER

Page 13: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (3/9)� Déclaration de la classe fille « Student »:

Florent DIEDLER

Page 14: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (4/9)� Implémentation de la classe fille « Student »:

Florent DIEDLER

Page 15: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (5/9)� Implémentation de la classe fille « Student » (suite)

Florent DIEDLER

Page 16: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (6/9)� Déclaration de la classe fille « Employee »:

Florent DIEDLER

Page 17: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (7/9)� Implémentation de la classe fille « Employee »:

Florent DIEDLER

Page 18: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (8/9)� Implémentation de la classe fille « Employee » (suite)

Florent DIEDLER

Page 19: C++ - chapitre 6 - héritage et polymorphisme

Héritage simple – C++ (9/9)� Utilisation des classes :

Florent DIEDLER

Page 20: C++ - chapitre 6 - héritage et polymorphisme

Héritage multiple (1/4)

� Classe fille héritant de plusieurs classes mères

Hérite toujours des attributs et méthodes � Hérite toujours des attributs et méthodes

� Notion existant dans quelques langages de POO

Florent DIEDLER

Page 21: C++ - chapitre 6 - héritage et polymorphisme

Héritage multiple (2/4)� Considérons l’exemple suivant :

Florent DIEDLER

Page 22: C++ - chapitre 6 - héritage et polymorphisme

Héritage multiple (3/4)� Concrètement :

Florent DIEDLER

Page 23: C++ - chapitre 6 - héritage et polymorphisme

Héritage multiple (4/4)

� Problèmes majeurs :

�Héritage en diamant

�Ambiguïté sur le nom des méthodes�Ambiguïté sur le nom des méthodes

�Constructeurs…

� Solution : Interdire l’héritage multiple

�Exemple : Java

Florent DIEDLER

Page 24: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme

� Notion difficile à comprendre au début

Examinons un exemple pour mieux comprendre� Examinons un exemple pour mieux comprendre

Florent DIEDLER

Page 25: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Problème (1/6)

� Soit la classe de base « Animal »

Florent DIEDLER

Page 26: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Problème (2/6)

� Et son implémentation :

Florent DIEDLER

Page 27: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Problème (3/6)

� Et les classes dérivées :

Florent DIEDLER

Page 28: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Problème (4/6)

� Et les classes dérivées :

Florent DIEDLER

Page 29: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Problème (5/6)� Test 1 :

� Sortie standard (sur console) :

I am an animal !

I am a bird !

Florent DIEDLER

Page 30: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Problème (6/6)� Test 2 :

� Sortie standard (sur console) :

I am an animal !

I am an animal ! � PAS CORRECT

Florent DIEDLER

Page 31: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Analyse

� La nature de l’objet « b » de type « Bird » est perdue…

Serais-ce un bug ?� Serais-ce un bug ?

�Non – Héritage ==> b « est un » animal…

� Peut-on régler le problème ?

� Oui – Polymorphisme !

Florent DIEDLER

Page 32: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Corrections (1/2)

� Méthode « display » de la classe mère devient virtuelle

Fonction « display_animal » prend un pointeur ou une � Fonction « display_animal » prend un pointeur ou une référence en paramètre

� Le destructeur devient virtuel !!

Florent DIEDLER

Page 33: C++ - chapitre 6 - héritage et polymorphisme

Polymorphisme – Corrections (2/2)

Florent DIEDLER

Page 34: C++ - chapitre 6 - héritage et polymorphisme

Classe abstraite (1/3)

� Définition : Classe incomplète non instanciable !

Propriété : � Propriété :

� Possède au minimum une méthode virtuelle pure

� Doit être héritée

� Exemple :

Florent DIEDLER

Page 35: C++ - chapitre 6 - héritage et polymorphisme

Classe abstraite (2/3)� Doit être « dérivée » pour pouvoir être utilisée

� Classes dérivées doivent redéfinir les méthodes virtuelles pures

Florent DIEDLER

Page 36: C++ - chapitre 6 - héritage et polymorphisme

Classe abstraite (3/3)� Utilisation d’une classe abstraite :

Florent DIEDLER

Page 37: C++ - chapitre 6 - héritage et polymorphisme

Pour résumer (1/2)

� Héritage simple :

� Classe fille dérive d’une classe mère et hérite de tous ses attributs (s’ils sont « protected ») et méthodesattributs (s’ils sont « protected ») et méthodes

� Permet de factoriser le code

� Héritage multiple :

� Difficile à mettre en place correctement

� Difficile à maintenir

Florent DIEDLER

Page 38: C++ - chapitre 6 - héritage et polymorphisme

Pour résumer (2/2)

� Polymorphisme :

� Modifier le comportement d’un objet en fonction de son type (objets polymorphes)type (objets polymorphes)

� Permet encore de factoriser le code

� Classe abstraite :

� Définir les grandes lignes du comportement d’une classe

� Permet encore de factoriser le code ☺

Florent DIEDLER

Page 39: C++ - chapitre 6 - héritage et polymorphisme

Pour aller plus loin…

� Introduction aux DP (Design Pattern)

� http://ericreboisson.developpez.com/livres/developpement/java/design/patterns/ava/design/patterns/

� Amitié en C++

� http://cpp.developpez.com/faq/cpp/?page=Les-amis-friend

� La REFERENCE en C++ :

� http://www.cplusplus.com/reference/

Florent DIEDLER

Page 40: C++ - chapitre 6 - héritage et polymorphisme

Merci de votre attention !Merci de votre attention !

Florent DIEDLER