Vous êtes sur la page 1sur 20

L'hritage

Par M@teo21 et Nanoc

www.siteduzero.com

Dernire mise jour le 15/09/2011

Sommaire

1/19

Sommaire
Sommaire ........................................................................................................................................... 1 Informations sur le tutoriel ................................................................................................................... 0 L'hritage ............................................................................................................................................ 2
Informations sur le tutoriel ................................................................................................................................................. 2 Exemple d'hritage simple ................................................................................................................................................ 2
Comment reconnatre un hritage ? ............................................................................................................................................................................ 2 Notre exemple : la classe Personnage ....................................................................................................................................................................... 3 La classe Guerrier hrite de la classe Personnage .................................................................................................................................................... 4 La classe Magicien hrite aussi de Personnage ......................................................................................................................................................... 6

La drivation de type ......................................................................................................................................................... 8 Hritage et constructeurs ................................................................................................................................................ 11


Appeler le constructeur de la classe mre ................................................................................................................................................................ 11 Transmission de paramtres ..................................................................................................................................................................................... 12 Schma rsum ........................................................................................................................................................................................................ 12

La porte protected ......................................................................................................................................................... 13 Le masquage ................................................................................................................................................................... 14


Une fonction de la classe mre ................................................................................................................................................................................. 14 La fonction est hrite dans les classes filles ........................................................................................................................................................... 15 Le masquage ............................................................................................................................................................................................................. 16 conomiser du code ................................................................................................................................................................................................. 17 Le dmasquage ......................................................................................................................................................................................................... 18

Q.C.M. ............................................................................................................................................................................. 18

www.siteduzero.com

L'hritage

2/19

L'hritage
Nous allons maintenant dcouvrir une des notions les plus importantes de la POO : l'hritage. Qu'on se rassure, il n'y aura pas de morts.
(voil a c'est fait)

Informations sur le tutoriel


Auteurs : Mathieu Nebra (M@teo21) Matthieu Schaller (Nanoc) Difficult : Licence :

L'hritage, c'est un concept trs important qui fait lui tout seul peut-tre plus de la moiti de l'intrt de la programmation oriente objet. Bref, a rigole pas. C'est pas le moment de s'endormir au fond, je vous ai l'il.

Nous allons dans ce chapitre rutiliser notre exemple de la classe Personnage, mais on va beaucoup le simplifier pour se concentrer uniquement sur ce qui est important. En clair, on va juste garder le strict minimum, histoire d'avoir un exemple simple mais que vous connaissez dj. Allez, bon courage, cette notion n'est pas bien dure comprendre, elle est juste trs riche. Sommaire du chapitre :

Exemple d'hritage simple La drivation de type Hritage et constructeurs La porte protected Le masquage Q.C.M.

Exemple d'hritage simple


"Hritage", c'est un drle de mot pour de la programmation hein Alors c'est quoi ? C'est une technique qui permet de crer une classe partir d'une autre classe. Elle lui sert de modle, de base de dpart. Cela permet d'viter avoir rcrire un mme code source plusieurs fois.

Comment reconnatre un hritage ?


C'est LA question se poser. Certains ont tellement t traumatiss par l'hritage qu'ils en voient partout, d'autres au contraire (surtout les dbutants) se demandent chaque fois s'il y a un hritage faire ou pas. Pourtant, ce n'est pas "mystique", il est trs facile de savoir s'il y a une relation d'hritage entre 2 classes. Comment ? En suivant cette rgle trs simple :

Il y a hritage quand on peut dire : "A est un B"


Pas de panique c'est pas des maths Prenez un exemple trs simple. On peut dire "Un guerrier est un personnage", ou encore "Un magicien est un personnage". Donc on peut faire un hritage : "La classe Guerrier hrite de Personnage", "La classe Magicien hrite de Personnage".

www.siteduzero.com

L'hritage
Pour vous imprgner, voici quelques autres bons exemples o un hritage peut tre fait : Une voiture est un vhicule (Voiture hrite de Vehicule) Un bus est un vhicule (Bus hrite de vhicule) Un moineau est un oiseau (Moineau hrite d'Oiseau) Un corbeau est un oiseau (Corbeau hrite d'Oiseau) Un chirurgien est un docteur (Chirurgien hrite de Docteur) Un diplodocus est un dinosaure (Diplodocus hrite de Dinosaure) etc. En revanche, vous ne pouvez pas dire "Un dinosaure est un diplodocus", ou encore "Un bus est un oiseau". Donc on ne peut pas faire d'hritage dans ces cas-l, du moins a n'aurait aucun sens

3/19

J'insiste, mais il est trs important de respecter cette rgle. Vous risquez de vous retrouver avec des gros problmes de logique dans vos codes si vous ne le faites pas.

Nous allons voir comment raliser un hritage en C++, mais d'abord il faut que je pose l'exemple sur lequel on va travailler

Notre exemple : la classe Personnage


Petit rappel : cette classe reprsente un personnage d'un jeu vido de type RPG (jeu de rle). Il n'est pas ncessaire de savoir jouer ou d'avoir jou un RPG pour suivre mon exemple. J'ai juste choisi celui-l car il est plus ludique que la plupart des exemples barbants que les profs d'informatique aiment utiliser (Voiture, Bibliothque, Universit, PompeAEssence...). On va un peu simplifier notre classe Personnage. Voici ce sur quoi je vous propose de partir : Code : C++ - Personnage.h #ifndef DEF_PERSONNAGE #define DEF_PERSONNAGE #include <iostream> #include <string> class Personnage { public: Personnage(); void recevoirDegats(int degats); void coupDePoing(Personnage &cible) const; private: int m_vie; std::string m_nom;

};

#endif

Notre Personnage a un nom et une quantit de vie. On n'a mis qu'un seul constructeur, le constructeur par dfaut. Il permet d'initialiser le Personnage avec un nom et lui donnera 100 points de vie. Le Personnage peut recevoir des dgts, via la mthode recevoirDegats() et en distribuer, via la mthode

www.siteduzero.com

L'hritage
coupDePoing(). A titre informatif, voici l'implmentation des mthodes dans Personnage.cpp : Code : C++ - Personnage.cpp #include "Personnage.h" using namespace std; Personnage::Personnage() : m_vie(100), m_nom("Jack") { } void Personnage::recevoirDegats(int degats) { m_vie -= degats; } void Personnage::coupDePoing(Personnage &cible) const { cible.recevoirDegats(10); }

4/19

Rien d'extraordinaire pour le moment.

La classe Guerrier hrite de la classe Personnage


Intressons-nous maintenant l'hritage. L'ide, c'est de crer une nouvelle classe qui est une sous-classe de Personnage. On dit que cette classe va hriter de Personnage. Pour cet exemple, je vais crer une classe Guerrier qui hrite de Personnage. La dfinition de la classe, dans Guerrier.h, ressemble ceci : Code : C++ - Guerrier.h #ifndef DEF_GUERRIER #define DEF_GUERRIER #include <iostream> #include <string> #include "Personnage.h" // Ne pas oublier d'inclure Personnage.h pour pouvoir en hriter ! class Guerrier : public Personnage // Signifie : crer une classe Guerrier qui hrite de la classe Personnage { }; #endif

Grce ce qu'on vient de faire, la classe Guerrier contiendra de base tous les attributs et toutes les mthodes de la classe Personnage. Dans un tel cas, la classe Personnage est appele la classe "Mre", et la classe Guerrier la classe "Fille". Mais quel intrt de crer une nouvelle classe si c'est pour qu'elle contienne les mmes attributs et les mmes

www.siteduzero.com

L'hritage
mthodes ?

5/19

Attendez, justement ! Le truc, c'est qu'on peut rajouter des attributs et des mthodes spciales dans la classe Guerrier . Par exemple, on pourrait rajouter une mthode qui ne concerne que les guerriers, du genre frapperCommeUnSourdAvecUnMarteau (bon ok c'est un nom de mthode un peu long j'avoue ). Code : C++ - Guerrier.h #ifndef DEF_GUERRIER #define DEF_GUERRIER #include <iostream> #include <string> #include "Personnage.h" class Guerrier : public Personnage { public: void frapperCommeUnSourdAvecUnMarteau() const; // Mthode qui ne concerne que les guerriers }; #endif

Schmatiquement, on reprsente la situation comme a :

Le schma se lit de bas en haut, c'est--dire "Guerrier hrite de Personnage". Guerrier est la classe fille, Personnage est la classe mre. On dit que Guerrier est une "spcialisation" de la classe Personnage. Elle possde toutes les caractristiques d'un Personnage (de la vie, un nom, elle peut recevoir des dgts), mais possde en plus des caractristiques propres au Guerrier comme frapperCommeUnSourdAvecUnMarteau().

www.siteduzero.com

L'hritage

6/19

Retenez bien que lorsqu'on fait un hritage, on hrite des mthodes et des attributs. Je n'ai pas reprsent les attributs sur le schma ci-dessus pour ne pas surcharger, mais la vie et le nom du Personnage sont bel et bien hrits, ce qui fait qu'un Guerrier possde aussi de la vie et un nom !

Vous commencez comprendre le principe ? En C++, quand on a deux classes qui sont lies par la relation EST-UN, on utilise l'hritage pour mettre en vidence ce lien. Un Guerrier EST-UN Personnage amlior qui possde une mthode supplmentaire. Ce concept a l'air de rien comme a, mais croyez-moi a fait la diffrence ! Vous n'allez pas tarder voir tout ce que a a de puissant lorsque vous pratiquerez plus loin dans le cours.

La classe Magicien hrite aussi de Personnage


Tant qu'il n'y a qu'un seul hritage, l'intrt semble encore limit. Mais multiplions un peu les hritages et les spcialisations et nous allons vite voir tout l'intrt de la chose. Par exemple, si on crait une classe Magicien qui va elle aussi hriter de Personnage ? Aprs tout, un Magicien est un Personnage, donc il peut rcuprer les mmes proprits de base : de la vie, un nom, donner un coup de poing, etc. La diffrence, c'est que le Magicien peut aussi envoyer des sorts magiques, par exemple bouleDeFeu et bouleDeGlace. Pour utiliser sa magie, il a une rserve de magie qu'on appelle "Mana" (a va faire un attribut rajouter). Quand la Mana tombe zro, il ne peut plus lancer de sort. Code : C++ - Magicien.h #ifndef DEF_MAGICIEN #define DEF_MAGICIEN #include <iostream> #include <string> #include "Personnage.h" class Magicien : public Personnage { public: void bouleDeFeu() const; void bouleDeGlace() const; private: int m_mana;

};

#endif

Je ne vous donne pas l'implmentation des mthodes (le .cpp) ici, je veux juste que vous compreniez et reteniez le principe :

www.siteduzero.com

L'hritage

7/19

Notez que sur le schma je n'ai reprsent que les mthodes des classes, mais les attributs (vie, nom...) sont eux aussi hrits ! Et le plus beau, c'est qu'on peut faire une classe qui hrite d'une classe qui hrite d'une autre classe ! Imaginons qu'il y ait 2 types de magiciens : les magiciens blancs, qui sont des gentils qui envoient des sorts de gurison tout a tout a, et les magiciens noirs qui sont des mchants qui utilisent leurs sorts pour tuer des gens (super exemple, j'en suis fier). Avada Kedavra !

www.siteduzero.com

L'hritage

8/19

Et a pourrait continuer longtemps comme a. Vous verrez dans la prochaine partie sur la bibliothque C++ Qt qu'il y a souvent 5 ou 6 hritages qui sont faits la suite. C'est vous dire si c'est utilis !

La drivation de type
Imaginons le code suivant : Code : C++ Personnage monPersonnage; Guerrier monGuerrier; monPersonnage.coupDePoing(monGuerrier); monGuerrier.coupDePoing(monPersonnage);

Compilez : a marche. Mais si vous tes attentif, vous devriez vous demander pourquoi a a march, parce que normalement

www.siteduzero.com

L'hritage
a n'aurait pas d ! ... non, vous ne voyez pas ? Allez un effort, voici le prototype de coupDePoing (il est le mme dans la classe Personnage et dans la classe Guerrier rappelez-vous) : Code : C++ void coupDePoing(Personnage &cible) const;

9/19

Quand on fait monGuerrier.coupDePoing(monPersonnage);, on envoie bien un Personnage en paramtre. Mais quand on fait monPersonnage.coupDePoing(monGuerrier);, a marche aussi et le compilateur ne hurle pas la mort alors que, selon toute logique, il devrait ! En effet, la mthode coupDePoing attend un Personnage et on lui envoie un Guerrier. Pourquoi diable cela fonctionne-t-il ?

Eh bien... c'est justement une proprit trs intressante de l'hritage en C++ que vous venez de dcouvrir l. On peut substituer un objet fille un pointeur ou une rfrence d'un objet mre. Ce qui veut dire, dans une autre langue que le chinois, qu'on peut faire a : Code : C++ Personnage *monPersonnage(0); Guerrier *monGuerrier = new Guerrier(); monPersonnage = monGuerrier; // Mais... mais... Ca marche !?

Les 2 premires lignes n'ont rien d'extraordinaire : on cre un pointeur Personnage mis 0, et un pointeur Guerrier qu'on initialise avec l'adresse d'un nouvel objet de type Guerrier. Par contre, la dernire ligne est assez surprenante. Normalement, on ne devrait pas pouvoir donner un pointeur de type Personnage un pointeur de type Guerrier. C'est comme mlanger des carottes et des patates, a ne se fait pas. Alors oui, en temps normal le compilateur n'accepte pas d'changer des pointeurs (ou des rfrences) de types diffrents. Or, Personnage et Guerrier ne sont pas n'importe quels types : Guerrier hrite de Personnage. Et la rgle connatre, c'est justement qu'on peut affecter un lment enfant un lment parent ! En fait c'est logique puisque Guerrier EST UN Personnage. L'inverse est faux par contre ! On ne peut PAS faire : monGuerrier = monPersonnage; Ceci plante et est strictement interdit. Attention au sens de l'affectation donc.

Cela nous permet donc de placer un lment dans un pointeur (ou une rfrence) de type plus gnral. C'est trs pratique dans notre cas lorsqu'on passe une cible en paramtre : Code : C++ void coupDePoing(Personnage &cible) const;

Notre mthode coupDePoing est capable de faire mal n'importe quel Personnage ! Qu'il soit Guerrier, Magicien, MagicienBlanc, MagicienNoir ou autre, c'est un Personnage aprs tout, donc on peut lui donner un coupDePoing

www.siteduzero.com

L'hritage

10/19

C'est un peu choquant au dbut je le reconnais, mais on se rend compte au final qu'en fait c'est trs bien fait. Ca fonctionne, puisque la mthode coupDePoing ne fait qu'appeler des mthodes de la classe Personnage (recevoirDegats), et que ces mthodes se trouvent forcment dans toutes les classes filles (Guerrier, Magicien). Relisez-moi, essayez de comprendre, vous devriez saisir pourquoi a marche Eh ben non, moi je comprends PAS ! Je ne vois pas pourquoi a marche si on fait : objetMere = objetFille; L on affecte la fille la mre, or la fille possde des attributs que la mre n'a pas. a devrait coincer ! L'inverse ne serait pas plus logique ?

Je vous rassure, personnellement j'ai mis des mois avant d'arriver comprendre ce qui se passait vraiment (comment a a vous rassure pas ? ) Votre erreur est de croire qu'on affecte la fille la mre. Non on n'affecte pas la fille la mre, on substitue un pointeur (ou une rfrence). Dj c'est pas du tout pareil. Les objets restent comme ils sont dans la mmoire. On fait juste pointer le pointeur sur la partie de la fille qui a t hrite. La classe fille est constitue de deux morceaux, les attributs et mthodes hrites de la mre d'une part et les attributs et mthodes propres la classe fille. En faisant objetMere = objetFille;, on fait pointer le pointeur objetMere sur les attributs et mthodes hrites uniquement.

Voil je peux difficilement pousser l'explication plus loin, j'espre que vous allez comprendre, sinon pas de panique j'ai survcu plusieurs mois de programmation en C++ sans bien comprendre ce qui se passait et j'en suis pas mort (mais c'est mieux si vous comprenez c'est clair !) En tout cas sachez que c'est une technique trs utilise, on s'en sert vraiment souvent en C++ ! Vous dcouvrirez bien a avec la pratique en utilisant Qt dans la prochaine partie.

www.siteduzero.com

L'hritage

11/19

Hritage et constructeurs
Vous avez peut-tre remarqu que je n'ai pas encore parl des constructeurs dans les classes filles (Guerrier, Magicien...). C'est le moment justement de s'y intresser On sait que Personnage a un constructeur (un constructeur par dfaut) dfini comme ceci dans le .h : Code : C++ Personnage();

... et son implmentation dans le .cpp : Code : C++ Personnage::Personnage() : m_vie(100), m_nom("Jack") { }

Comme vous le savez, lorsqu'on cre un objet de type Personnage, le constructeur est appel avant toute chose. Mais maintenant, que se passe-t-il lorsqu'on cre par exemple un Magicien qui hrite de Personnage ? Le Magicien a le droit d'avoir un constructeur lui aussi ! Est-ce que a ne va pas interfrer avec le constructeur de Personnage ? Il faut pourtant appeler le constructeur de Personnage si on veut que la vie et le nom soient initialiss ! En fait, les choses se drouleront dans l'ordre suivant : 1. Vous demandez crer un objet de type Magicien 2. Le compilateur appelle d'abord le constructeur de la classe mre (Personnage) 3. Puis, le compilateur appelle le constructeur de la classe fille (Magicien) En clair, c'est d'abord le constructeur du "parent" qui est appel, puis celui du fils, et ventuellement du petit fils (s'il y a un hritage d'hritage, comme c'est le cas avec MagicienBlanc).

Appeler le constructeur de la classe mre

Pour appeler le constructeur de Personnage en premier, il faut y faire appel depuis le constructeur de Magicien. C'est dans un cas comme a qu'il est bon indispensable de se servir de la liste d'initialisation (vous savez, tout ce qui suit le symbole deuxpoints dans l'implmentation). Code : C++ Magicien::Magicien() : Personnage(), m_mana(100) { }

www.siteduzero.com

L'hritage

12/19

Le premier lment de la liste d'initialisation dit de faire d'abord appel au constructeur de la classe parente Personnage. Puis, les initialisations propres au Magicien sont faites (comme l'initialisation de la mana 100). Lorsqu'on cre un objet de type Magicien, le compilateur appelle le constructeur par dfaut de la classe mre (celui qui ne prend pas de paramtre).

Transmission de paramtres
Le gros avantage de cette technique est que l'on peut "transmettre" les paramtres du constructeur de Magicien au constructeur de Personnage. Par exemple, si le constructeur de Personnage prenait un nom en paramtre, il faudrait que le Magicien accepte lui aussi ce paramtre et le fasse passer au constructeur de Personnage : Code : C++ Magicien::Magicien(string nom) : Personnage(nom), m_mana(100) { }

Bien entendu, si on veut que a marche il faudra aussi surcharger le constructeur de Personnage pour qu'il accepte un paramtre string ! Code : C++ Personnage::Personnage(string nom) : m_vie(100), m_nom(nom) { }

Et voil comment on fait "remonter" des paramtres d'un constructeur un autre pour s'assurer que l'objet se cre correctement

Schma rsum
Pour bien mmoriser ce qui se passe, rien de tel qu'un schma rsum n'est-ce pas ?

www.siteduzero.com

L'hritage

13/19

Il faut bien entendu le lire dans l'ordre pour en comprendre le fonctionnement. On commence par demander crer un Magicien. "Oh mais c'est un objet" se dit le compilateur, "il faut que j'appelle son constructeur". Or, le constructeur du Magicien indique qu'il faut d'abord appeler le constructeur de la classe parente Personnage. Le compilateur va donc voir la classe parente, puis excute son code. Il retourne ensuite au constructeur du Magicien et excute son code. Une fois que tout cela est fait, notre objet merlin devient utilisable et on peut enfin faire subir les pires svices notre cible

La porte protected
Il me serait vraiment impossible de vous parler d'hritage sans vous parler de la porte protected. Rappel : les portes (ou droits d'accs) que vous connaissez dj sont : public : les lments qui suivent seront accessibles depuis l'extrieur de la classe. private : les lments qui suivent ne seront pas accessibles depuis l'extrieur de la classe.

Je vous ai en particulier donn la rgle fondamentale du C++, l'encapsulation, qui veut que l'on empche systmatiquement au monde extrieur d'accder aux attributs de nos classes. La porte protected est un autre type de droit d'accs que je classerais entre public (le plus permissif) et private (le

www.siteduzero.com

L'hritage

14/19

plus restrictif). Il n'a de sens que pour les classes qui se font hriter (les classes mres) mais on peut les utiliser sur toutes les classes mme quand il n'y a pas d'hritage. Sa signification est la suivante : protected : les lments qui suivent ne seront pas accessibles depuis l'extrieur de la classe, sauf si c'est une classe fille. Cela veut dire par exemple que si l'on met des lments en protected dans la classe Personnage, on y aura accs dans les classes filles Guerrier et Magicien. Avec la porte private, on n'aurait pas pu y accder ! En pratique, personnellement je donne toujours la porte protected aux attributs de mes classes. C'est comme private (donc a respecte l'encapsulation) sauf que comme a, au cas o j'hrite un jour de cette classe, j'aurai aussi directement accs aux attributs. Cela est souvent ncessaire voire indispensable sinon on doit utiliser des tonnes d'accesseurs (mthodes getVie(), getMana(), ...) et a rend le code bien plus lourd.

Code : C++ class Personnage { public: Personnage(); Personnage(std::string nom); void recevoirDegats(int degats); void coupDePoing(Personnage &cible) const; protected: // Priv, mais accessible aux lments enfants (Guerrier, Magicien, ...) int m_vie; std::string m_nom; };

On peut alors directement manipuler la vie et le nom dans tous les lments enfants de Personnage, comme Guerrier et Magicien !

Le masquage
Terminons ce chapitre avec une notion qui nous servira dans la suite : le masquage.

Une fonction de la classe mre


Il serait intressant pour notre petit RPG que nos personnages aient le moyen de se prsenter. Comme c'est une action que devraient pouvoir raliser tous les personnages quels que soient leurs rles militaires, la fonction sePresenter() va dans la classe Personnage. Code : C++ class Personnage { public: Personnage(); Personnage(std::string nom); void recevoirDegats(int degats); void coupDePoing(Personnage& cible) const; void sePresenter() const;

www.siteduzero.com

L'hritage
protected: int m_vie; std::string m_nom;

15/19

};

Remarquez le const qui indique que le personnage ne sera pas modifi quand il se prsentera. Vous en avez maintenant l'habitude, mais j'aime bien vous rafraichir la mmoire.

Et dans le fichier .cpp : Code : C++ void Personnage::sePresenter() const { cout << "Bonjour, je m'appelle " << m_nom << "." << endl; cout << "J'ai encore " << m_vie << " points de vie." << endl; }

On peut donc crire un main du type : Code : C++ int main() { Personnage marcel("Marcel"); marcel.sePresenter(); } return 0;

Ce qui nous donne videmment le rsultat suivant : Code : Console Bonjour, je m'appelle Marcel. J'ai encore 100 points de vie.

La fonction est hrite dans les classes filles


Vous le savez dj, un Guerrier EST UN Personnage et par consquent, il peut galement se prsenter. Code : C++ int main(){ Guerrier lancelot("Lancelot du Lac"); lancelot.sePresenter(); return 0;

www.siteduzero.com

L'hritage
}

16/19

Donnera : Code : Console Bonjour, je m'appelle Lancelot du Lac. J'ai encore 100 points de vie.

Jusque l, rien de bien particulier et de difficile.

Le masquage
Imaginons maintenant que les guerriers aient une manire diffrente de se prsenter. Ils doivent en plus dire qu'ils sont guerriers. Nous allons donc crire une version diffrente de la fonction sePresenter() spcialement pour eux : Code : C++ void Guerrier::sePresenter() const { cout << "Bonjour, je m'appelle " << m_nom << "." << endl; cout << "J'ai encore " << m_vie << " points de vie." << endl; cout << "Je suis un Guerrier redoutable." << endl; }

Mais, il y aura deux fonctions avec le mme nom et les mmes arguments dans la classe ! C'est interdit !

Vous avez tort et raison. Deux fonctions ne peuvent avoir la mme signature (nom et type des arguments). Mais dans le cadre des classes c'est diffrent. La fonction de la classe Guerrier va remplacer celle hrite de la classe Personnage. Si l'on excute le mme main() qu'avant, on obtient cette fois le rsultat souhait. Code : Console Bonjour, je m'appelle Lancelot du Lac. J'ai encore 100 points de vie. Je suis un guerrier redoutable.

Quand on crit une fonction qui a le mme nom que celle hrite de la classe mre, on parle de masquage. La fonction hrite de Personnage est masque ; elle est cache. Pour masquer une fonction, il suffit qu'elle ait le mme nom qu'une autre fonction hrite. Le nombre et le type des arguments ne joue aucun rle.

www.siteduzero.com

L'hritage

17/19

C'est bien pratique a ! Quand on fait un hritage, la classe fille reoit automatiquement toutes les mthodes de la classe mre. Si une de ces mthodes ne nous plait pas, on la rcrit dans la classe fille. Le compilateur saura quelle version appeler. Si c'est un Guerrier, il utilise la "version Guerrier" de sePresenter() et si c'est un Personnage ou un Magicien, il utilise la version de base.

Gardez bien ce schma en mmoire, il nous sera utile dans le prochain chapitre.

conomiser du code
Ce qu'on a crit est bien, mais on peut faire encore mieux. Si l'on regarde, la fonction sePresenter() de la classe Guerrier a deux lignes identiques ce qu'il y a dans la mme fonction de la classe Personnage. On pourrait donc conomiser des lignes de code en appelant la fonction masque. conomiser des lignes de code est souvent une bonne attitude avoir. Le code est ainsi plus facilement maintenable. Et souvenez-vous tre fainant est une qualit importante des programmeurs.

On aimerait donc crire quelque chose du genre : Code : C++ void Guerrier::sePresenter() const { appel_a_la_fonction_masquee(); //Cela afficherait les informations de base cout << "Je suis un Guerrier redoutable." << endl; //Et ensuite les informations spcifiques }

Il faudrait donc un moyen d'appeler la fonction de la classe mre.

www.siteduzero.com

L'hritage

18/19

Le dmasquage
On aimerait appeler la fonction dont le nom complet est : Personnage::sePresenter(). Essayons donc. Code : C++ void Guerrier::sePresenter() const { Personnage::sePresenter(); cout << "Je suis un Guerrier redoutable." << endl; }

Et c'est magique, cela donne exactement ce que l'on esprait. Code : Console Bonjour, je m'appelle Lancelot du Lac. J'ai encore 100 points de vie. Je suis un guerrier redoutable.

On parle dans ce cas de dmasquage puisqu'on a pu utiliser une fonction qui tait masque. On a utilis ici l'oprateur :: appel oprateur de rsolution de porte. Il sert dterminer quelle fonction (ou variable) utiliser quand il y a ambigut ou si il y a plusieurs possibilits.

Q.C.M.
La classe qui hrite d'une autre classe est aussi appele la classe...
Mre Fille Petite-fille

La porte protected empche l'accs aux mthodes et attributs qui suivent depuis l'extrieur de la classe, sauf...
... dans les classes filles ... dans la classe mre ... dans le main

Ce code est-il lgal (compilera-t-il) ?

Code : C++ Truc *monTruc(0); Bidule *monBidule = new Bidule();

www.siteduzero.com

L'hritage
monTruc = monBidule;

19/19

Oui Non Oui, si Truc hrite de Bidule Oui, si Bidule hrite de Truc Obi wan kenobi

Dans un cas d'hritage, dans quel ordre sont excuts les constructeurs ?
Mre puis fille Fille puis mre Mre et fille en mme temps

La classe B hrite de la classe A. Si A possde 3 mthodes et que B en possde 2 qui lui sont propres, combien de mthodes diffrentes un objet de type B pourra-t-il utiliser ?
2 3 5

Qu'est-ce que le masquage ?

Le fait de cacher une fonction membre hrite en crivant une fonction de mme nom dans la classe fille. Utiliser l'oprateur de rsolution de porte pour utiliser la fonction hrite. Avoir deux fonctions de noms presque semblables pour faire deux actions presque semblables. Mettre tous les attributs en priv pour cacher l'implmentation aux utilisateurs.

Correction !
Statistiques de rponses au QCM

Ce chapitre en impose peut-tre un peu par sa taille, mais ne vous y fiez pas ce sont surtout les schmas qui prennent de la place. D'ailleurs, j'ai volontairement vit de trop montrer de codes sources complets diffrents et j'ai prfr que vous vous focalisiez sur ces schmas. C'est ce qu'on retient le mieux en gnral, et a permet de bien se reprer. La pratique viendra dans la partie sur la librairie Qt. Ceci tant, peut-tre que vous aimeriez avoir le code source complet de mes exemples (Personnage, Guerrier, Magicien...). Ce code n'est pas complet, certaines mthodes ne sont pas crites, il ne fait rien d'extraordinaire. Mais il compile, et a vous permettra peut-tre de finir de mettre de l'ordre dans vos ides. Voici donc le code source :

Tlcharger le code source complet (3 Ko)


Bon bidouillage !

www.siteduzero.com