Académique Documents
Professionnel Documents
Culture Documents
Héritage et polymorphisme
Héritage
1. L'héritage
Nous allons maintenant découvrir une des notions les plus importantes de la
POO : l'héritage.
l'héritage est une technique qui permet de créer une classe à partir
d'une autre classe. Elle lui sert de modèle, de base de départ. Cela
permet d'éviter d'avoir à réécrire un même code source plusieurs fois.
Grâce à ce qu'on vient de faire, la classe Guerrier contiendra de base tous les
attributs et toutes les méthodes de la classe Personnage.
Justement ! Le truc, c'est qu'on peut rajouter des attributs et des méthodes
spéciales dans la classe Guerrier. Par exemple, on pourrait rajouter une méthode
qui ne concerne que les guerriers, du genre
frapperCommeUnSourdAvecUnMarteau (bon ok, c'est un nom de méthode un peu
long, je l'avoue, mais l'idée est là).
Héritage
1. L'héritage
La classe Guerrier hérite de la classe Personnage
Schématiquement, on représente la situation comme à la figure suivante.
Héritage
1. L'héritage
La classe Magicien hérite aussi de Personnage
Notez que, sur le schéma, je n'ai représenté que les méthodes des classes mais
les attributs (vie, nom… ) sont eux aussi hérités!
Et le plus beau, c'est qu'on peut faire une classe qui hérite d'une classe qui
hérite d'une autre classe !
Imaginons qu'il y ait deux types de magiciens : les magiciens blancs, qui sont
des gentils qui envoient des sorts de guérison, et les magiciens noirs qui sont
des méchants qui utilisent leurs sorts pour tuer des gens. Figure suivante :
Héritage
1. L'héritage
La classe Magicien hérite aussi de Personnage
Héritage
1. L'héritage
Héritage et constructeurs
Vous avez peut-être remarqué que je n'ai pas encore parlé des constructeurs
dans les classes filles (Guerrier, Magicien… ).
C'est justement le moment de s'y intéresser.
On sait que Personnage a un constructeur (par défaut) défini comme ceci:
};
Comme vous le savez, lorsqu'on crée un objet de type Personnage, le constructeur est
appelé avant toute chose.
Héritage
1. L'héritage
Héritage et constructeurs
En clair, c'est d'abord le constructeur du « parent » qui est appelé, puis celui
du fils, et éventuellement celui du petit-fils (s'il y a un héritage d'héritage,
comme c'est le cas avec MagicienBlanc).
Héritage
1. L'héritage
};
Transmission de paramètres
};
Héritage
1. L'héritage
Schéma résumé
Héritage
1. L'héritage
Il me serait vraiment impossible de vous parler d'héritage sans vous parler de la
portée protected.
Actuellement, les portées (ou droits d'accès) que vous connaissez déjà sont :
public : les éléments qui suivent sont accessibles depuis l'extérieur de la classe ;
private : les éléments qui suivent ne sont pas accessibles depuis l'extérieur de la
classe.
Je vous ai en particulier donné la règle fondamentale du C++, l'encapsulation, qui
veut que l'on empêche systématiquement au monde extérieur d'accéder aux attributs
de nos classes.
La portée protected est un autre type de droit d'accès que je classerais entre public
(le plus permissif) et private (le plus restrictif). Il n'a de sens que pour les classes qui
se font hériter (les classes mères) mais on peut l'utiliser sur toutes les classes, même
quand il n'y a pas d'héritage.
Voici sa signification : les éléments qui suivent protected ne sont pas accessibles
depuis l'extérieur de la classe, sauf si c'est une classe fille.
Cela veut dire, par exemple, que si l'on met des éléments en protected dans la classe
Personnage, on y aura accès dans les classes filles Guerrier et Magicien. Avec la
portée private, on n'aurait pas pu y accéder !
Héritage
1. L'héritage
On peut alors directement manipuler la vie et le nom dans tous les éléments enfants
de Personnage, comme Guerrier et Magicien !
Héritage
1. L'héritage
En résumé: