Académique Documents
Professionnel Documents
Culture Documents
hachanisafaa@gmail.com
1
Chapitre 4 :
Héritage et Polymorphisme
2
Polymorphisme
22
Polymorphisme – Exemple
▶ Chaque méthode qui porte sur la totalité des produits du stock doit faire 4 boucles :
une pour le parcours de chaque vecteur de produit.
Solution :
Rappel :
▶ Un pointeur d’une super-classe (produit) peut pointer sur des instances des sous-classes
(produit culturel, etc.)
▶ Les éléments du vector sont de même type (produit) mais ils peuvent «contenir» des
variantes différentes (sous-classes de produit),
24
25
Polymorphisme – Solution utilisant le polymorphisme
Conséquence ?
Lors de l’exécution d’afficher, les produits
perissables n’affichent pas leur date limite de
vente.
⇒La méthode de produit est appelée et non sa
redéfinition dans produitPerissable.
Attention ! Donc…
On déclarera toujours virtual les méthodes
pouvant être redéfinies et destinées à être
utilisées par polymorphisme. 27
Polymorphisme et Destructeur
Il faut donc les détruire explicitement. C’est le défaut d’utiliser des pointeurs
(plutôt que des instances).
28
Polymorphisme et Destructeur
Que se passerait-il si des sous-classes de produit définissaient un destructeur?
29
Polymorphisme et Destructeur
Attention.
Ne pas déclarer de destructeur dans une classe revient à déclarer un
destructeur qui «ne fait rien»…et qui est à liaison statique.
Dans produit le destructeur «ne fait rien», mais le déclarer virtual Pure permet de le
redéfinir dans les sous-classes et permet l’appel des destructeurs des sous-
classes par polymorphisme. 30
Détermination du type de la sous classe
On suppose que la classe produitPerissable dispose d’une méthode accesseur à
l’attribut «date de peremption», date const & peremption() const.
31
Détermination du type de la sous classe
Besoin: On veut écrire dans stock une méthode d’affichage de toutes les dates
de péremption.
Définition (dynamic_cast):
Corriger le code :
34
Détermination du type de la sous classe
Propriétés de dynamic_cast :
35
Problème de la classe stock
Une catastrophe!
Erreur de compilation:
cannot declare parameter ‘p’ to be of abstract type ‘produit’
37
Ajout de produit au stock – solution 2
Erreur à l’exécution:
Ce qui est rajouté au std::vector est un pointeur sur une variable locale.
On veut donc ajouter au vector un pointeur sur un objet qui n’est pas détruit à
la fin de l’exécution de la méthode.
38
Ajout de produit au stock – Solution 3
Le seul moyen est de créer dynamiquement les produits dans une méthode de
stock, de les détruire dans une méthode de stock.
A retenir :
La structure de données utilise le polymorphisme (std::vector<produit*>) mais
pas les méthodes d’ajout.
40
Ajout de produit au stock
Un «constructeur virtuel» est une façon de construire un nouvel objet, qui est
instance de la même classe qu’un objet existant (par exemple
référence/pointeur de super-classe).
42
Constructeur virtuel