Vous êtes sur la page 1sur 13

UNIVERSITE CADI AYAD ------o-----Ecoles Normales Suprieures Marrakech (ENSM) ------o------

Hritage Multiple en C++


Ralis par :

LAARIFI Jawad LACHGUER Abderrahim

Encadrs par : Mr. ZAKARIA

Hritage multiple en C++

Sommaire

Chapitre 1 : Introduction et rappels .......................................................... 3 I. Les pointeurs ................................................................................... 3 II. Constructeurs et destructeurs .......................................................... 4 III. La gestion dynamique : les oprateurs new et delete ................... 4

Chapitre 2 : Mise en uvre de lhritage multiple .................................... 6 I. Problmatique .................................................................................. 6 II. Dfinition de lhritage multiple ........................................................ 7 III. IV. Constructeur et destructeur........................................................... 7 Les classes virtuelles .................................................................... 8

V. Exemple dutilisation de lhritage multiple et de la drivation virtuelle .................................................................................................. 9 Conclusion.............................................................................................. 12 Bibliographie........................................................................................... 13

ENS Marrakech 2010/2011

Page 2

Chapitre 1 : Introduction et rappels


Le langage C++ est un langage de programmation orient objet, il permet de crer des logiciels, des programmes, excuts sur un ordinateur. Il sagit dun des langages les plus rpandue dans la plante, et rput pour sa puissance et sa flexibilit, on trouve des compilateurs C++ sur tous les types dordinateur, micro-ordinateur de type PC ou Macintosh, et sur tous les types du systme dexploitation Unix, Windows ou autres. Dans ce rapport on a abord la notion de lhritage multiple dans C++, mais avant dentamer cette partie, quelques notions indispensables pour la comprhension de lhritage en gnrale seront abordes.

Hritage multiple en C++

I.

Les pointeurs

C++ permet de manipuler des adresses par lintermdiaire de variables nommes pointeurs. Lexemple suivant est pour introduire cette notion : int * ad ; // on peut aussi crire : int *ad ; int n ; n = 20 ; ad = &n ; *ad = 30 ; // on peut crire aussi : * ad = 30 ; La premire rserve une variable nomme ad comme tant un pointeur sur des entiers. Nous verrons que * est un oprateur qui dsigne le contenu situ ladresse qui le suit. Ainsi, titre mnmonique, on peut dire que cette dclaration signifie que *ad, cest--dire lobjet dadresse ad, est de type int ; ce qui signifie bien que ad est ladresse dun entier. Linstruction : ad = &n ; affecte la variable ad la valeur de lexpression &n. Loprateur & est un oprateur unaire qui fournit comme rsultat ladresse de son oprande. Ainsi, cette instruction place dans la variable ad ladresse de la variable n. Linstruction suivante : *ad = 30 ; signifie : affecter *ad la valeur 30. Or *ad reprsente lentier ayant pour adresse. Dans lexemple qui suit, est un exemple dutilisation des pointeurs : #include <iostream> using namespace std ; main() { void echange (int *ad1, int *ad2) ; int a=10, b=20 ; cout << "avant appel : " << a << " " << b << "\n" ; echange (&a, &b) ; cout << "apres appel : " << a << " " << b << "\n" ; } void echange (int *ad1, int *ad2) { ENS Marrakech 2010/2011

Page 3

int x ; x = *ad1 ; *ad1 = *ad2 ; *ad2 = x ; }

Hritage multiple en C++

II.

Constructeurs et destructeurs

Ce sont des fonctions membres automatiquement appeles la naissance et la mort de lobjet. Cela simplifie grandement lutilisation des objets par rapport aux structures, pour lesquelles ces oprations devaient tre appeles par lutilisateur. Les constructeurs et les destructeurs, par dfinition, sont des fonctions qui ne renvoient aucun rsultat. Voila un exemple qui illustre la dfinition des constructeurs et les destructeurs, ainsi que leurs utilisations : class point { /* dclaration des membres privs */ int x ; int y ; public : /* dclaration des membres publics */ point (int, int) ; // constructeur void deplace (int, int) ; void affiche () ; } ; point::point (int abs, int ord) { x = abs ; y = ord ; } point::~point() // dfinition destructeur { cout << "-- Appel destructeur - num = " << num << "\n" ; } /* -------- Utilisation de la classe point -------- */ main() { int n ; point a(5,2); a.affiche () ; delete a ; cin>>n ; }

III.

La gestion dynamique : les oprateurs new et delete

C++ offre des possibilits dites dallocation dynamique de mmoire. les emplacements correspondants sont allous et librs la demande du programme lui mme. Pour ce faire, C++ dispose doprateurs particuliers : new et delete. ENS Marrakech 2010/2011 Page 4

Syntaxe et rle de new

Hritage multiple en C++

Loprateur unaire ( un seul oprande) new sutilise ainsi : new type o type reprsente un type absolument quelconque. Il fournit comme rsultat un pointeur (de type type*) sur lemplacement correspondant, lorsque lallocation a russi. Loprateur new accepte galement une syntaxe de la forme : new type [n] o n dsigne une expression entire quelconque (non ngative). Cette instruction alloue alors lemplacement ncessaire pour n lments du type indiqu ; si lopration a russi, elle fournit en rsultat un pointeur (toujours de type type *) sur le premier lment de ce tableau.

Remarque La norme de C++ prvoit quen cas dchec, new dclenche une exception de type bad_alloc.

Loprateur delete Lorsque lon souhaite librer un emplacement allou pralablement par new, on utilise loprateur delete. Ainsi, pour librer les emplacements crs par loperateur new, on crit : delete ad ; pour lemplacement allou par : ad = new int ; et : delete adc ; pour lemplacement allou par : adc = new char [100] ; Alors La syntaxe usuelle de loprateur delete est la suivante delete adresse.

IV.

Hritage simple

Lhritage simple est un mcanisme de base de la programmation oriente objet qui permet de prciser des relations particulires entre classes. Ainsi, il est possible de spcifier quune classe Cfille hrite dune seule classe Cmere, cest--dire que la premire constitue une extension de la seconde. Autrement dit, une classe hrite dune autre quand elle en acquiert les proprits (attributs et mthodes). On peut ainsi construire une classe sur la base dune ou de plusieurs autres, en ajoutant ou en modifiant des proprits des anciennes dans la nouvelle. La connaissance des notions de lhritage simple est indispensable pour comprendre lhritage multiple, et toutes les notions de lhritage simple reste valables pour la mise en uvre de lhritage multiple. ENS Marrakech 2010/2011

Page 5

Chapitre 2 : Mise en uvre de lhritage multiple


I. Problmatique
Chaque notion dfinie dans un langage est ncessairement utile, et elle est conut pour rsoudre un problme bien dfini. Lexemple qui suit reprsente un cas, o lutilisation de lhritage multiple est indispensable. Considrons une classe Personne qui reprsente les personnels dans notre tablissement. Personne { String String String Public String }

Hritage multiple en C++

nom ; prenom ; CIN ; : getNom();

Considrons maintenant deux classes, Etudiant et Professeur qui hrite de la classe Personne. Et admettons quun professeur un numro MAT, donn par ltat un professeur. Et quun tudiant a un code CNE. Class Etudiant : public Personne { String CNE ; Public : String CNE(); } Class Professeur : public Personne { String MAT ; Public : String getMat() ; } Maintenant on veut crer une classe pour un type de personne qui est tudiant professeur. Dans ce cas ltudiant professeur va avoir les proprits dun tudiant, ainsi que les proprits dun professeur. Do la ncessit de dfinir un nouvel type dhritage qui permettra cette nouvelle classe davoir les proprits des deux classes Professeur et Etudiant. Page 6

ENS Marrakech 2010/2011

Lhritage multiple est lorsquune classe possde plusieurs classes mres. Elle hrite de toutes leurs proprits. Lhritage multiple est beaucoup moins utilis que lhritage simple car il implique que lapplication dvelopper possde une architecture complexe. Nanmoins, il peut avoir son utilit, comme nous lavons vue dans lexemple prcdent.

II.

Dfinition de lhritage multiple

Hritage multiple en C++

Personne

Etudiant

Professeur

Etudiant_professeur

La syntaxe de lhritage multiple class nom_classe_fille : type_acces nom_classe_mere1, type_acces nom_classe_mere2, ...

III.

Constructeur et destructeur

Voila la syntaxe de la mise en uvre du constructeur : nom_classe_fille (.) : nom_classe_mere1 (.),nom_classe_mere2 (.), Lordre dappel des constructeurs est le suivant : constructeurs des classes de base, dans lordre o les classes de base sont dclares dans la classe drive; constructeur de la classe drive (ici, nom_class_fille). Les destructeurs ventuels seront appels dans lordre inverse lors de la destruction dun objet de type nom_class_fille. Remarque Java ne connat pas lhritage multiple. En revanche, il dispose de la notion dinterface (inconnue de C++) qui permet en gnral de traiter plus lgamment les problmes. Une ENS Marrakech 2010/2011

Page 7

interface est simplement un ensemble de spcifications de mthodes (il ny a pas de donnes). Lorsquune classe implmente une interface, elle doit fournir effectivement les mthodes correspondantes. Une classe peut implmenter autant dinterfaces quelle le souhaite, indpendamment de la notion dhritage.

Hritage multiple en C++

IV.

Les classes virtuelles

Elles sont l pour rgler les ventuels conflits, considrons la situation suivante :

D correspondant des dclarations telles que : class A { ..... int x, y ; } ; class B : public A {.....} ; class C : public A {.....} ; class D : public B, public C{ .....} ; En quelque sorte, D hrite deux fois de A ! Dans ces conditions, les membres de A (fonctions ou donnes) apparaissent deux fois dans D. En ce qui concerne les fonctions membres, cela est manifestement inutile (ce sont les mmes fonctions), mais sans importance puisquelles ne sont pas rellement dupliques (il nen existe quune pour la classe de base). En revanche, les membres donnes (x et y) seront effectivement dupliqus dans tous les objets de type D. Y a-t-il redondance ? En fait, la rponse dpend du problme. Si lon souhaite que D dispose de deux jeux de donnes (de A), on ne fera rien de particulier et on se contentera de les distinguer laide de loprateur de rsolution de porte. Par exemple, on distinguera : A::B::x de A::C::x ENS Marrakech 2010/2011 Page 8

ou, ventuellement, si B et C ne possdent pas de membre x : B::x de C::x

Hritage multiple en C++

Dans les conditions normale, on ne souhaite pas avoir ce genre de duplication de donnes, dans ce cas on dclare les classes B et C, comme tant virtuelles (mot cl virtual) :

class B : public virtual A {.....} ; class C : public virtual A {.....} ; class D : public B, public C {.....} ; noter que virtual apparat ici dans B et C. En effet, dfinir A comme virtuelle dans la dclaration de B signifie que A ne devra tre introduite quune seule fois dans les descendants ventuels de C. Autrement dit, cette dclaration na gure deffet sur les classes B et C elles-mmes (si ce nest une information cache mise en place par le compilateur pour marquer A comme virtuelle au sein de B et C !). Avec ou sans le mot virtual, les classes B et C, se comportent de la mme manire tant quelles nont pas de descendants. Dans ce cas des classes virtuel, lorsquon dclare un objet de type D, le constructeur de la classe A sera appel par quel constructeur : le constructeur de la classe B ou le constructeur de la classe C ? Dans ce cas C++ rsout le problme comme suite : Le choix des informations fournir au constructeur de A a lieu non plus dans B ou C, mais dans D. Pour ce faire, C++ vous autorise (uniquement dans ce cas de drivation virtuelle ) spcifier, dans le constructeur de D, des informations destines A. Ainsi, nous pourrons avoir : D (int n, int p, double z) : B (n, p, z), A (n, p) Bien entendu, il sera inutile (et interdit) de prciser des informations pour A au niveau des constructeurs B et C. noter aussi que A doit avoir un constructeur sans argument, affin de dclarer dune manire convenable les objets B et C.

V.

Exemple dutilisation de lhritage multiple et de la drivation virtuelle

Nous proposons ici un petit exemple illustrant la fois lhritage multiple, les drivations virtuelles et les transmissions dinformations entre constructeurs. On dfini une classe coul pour reprsenter une couleur et une classe pointcol drive de point pour reprsenter des points colors, une classe masse pour reprsenter une masse et une classe pointmasse pour reprsenter des points dots dune masse. Enfin, nous crons une classe pointcolmasse pour reprsenter des points dots la fois dune couleur et dune masse. Nous la faisons driver de pointcol et de pointmasse, ce qui nous conduit ce schma : ENS Marrakech 2010/2011

Page 9

Hritage multiple en C++

Pour viter la duplication des membres de point dans cette classe, on voit quil est ncessaire davoir prvu que les classes pointcol et pointmasse drivent virtuellement de la classe point qui doit alors disposer dun constructeur sans argument. Et enfin voila limplmentation de cette structure :

#include <iostream> class point { int x, y ; public : point (int abs, int ord) { cout << "++ Constr. point " << abs << " " << ord << "\n" ; x=abs ; y=ord ; } point () // constr. par dfaut ncessaire pour drivations virtuelles { cout << "++ Constr. defaut point \n" ; x=0 ; y=0 ; } void affiche () { cout << "Coordonnees : " << x << " " << y << "\n" ; } } ; class coul { short couleur ; public : coul (short cl) { cout << "++ Constr. coul " << cl << "\n" ; couleur = cl ; } void affiche () { cout << "Couleur : " << couleur << "\n" ; } } ; class masse { int mas ; public : masse (int m) { cout << "++ Constr. masse " << m << "\n" ; mas = m ; } ENS Marrakech 2010/2011

Page 10

void affiche () { cout << "Masse : " << mas << "\n" ; } } ; class pointcoul : public virtual point, public coul { public : pointcoul (int abs, int ord, int cl) : coul (cl) // pas dinfo pour point car drivation virtuelle { cout << "++++ Constr. pointcoul " << abs << " " << ord << " " << cl << "\n" ; } void affiche () { point::affiche () ; coul::affiche () ; } } ; class pointmasse : public virtual point, public masse { public : pointmasse (int abs, int ord, int m) : masse (m) // pas dinfo pour point car drivation virtuelle { cout << "++++ Constr. pointmasse " << abs << " " << ord << " " << m << "\n" ; } void affiche () { point::affiche () ; masse::affiche () ; } } ; class pointcolmasse : public pointcoul, public pointmasse { public : pointcolmasse (int abs, int ord, short c, int m) : point (abs, ord), pointcoul (abs, ord, c), pointmasse (abs, ord, m) // infos abs ord en fait inutiles pour pointcol et pointmasse { cout << "++++ Constr. pointcolmasse " << abs + " " << ord << " " << c << " " << m << "\n" ; } void affiche () { point::affiche () ; coul::affiche() ; masse::affiche () ; } } ; main() { pointcoul p(3,9,2) ; p.affiche () ; // appel de affiche de pointcoul pointmasse pm(12, 25, 100) ; pm.affiche () ; pointcolmasse pcm (2, 5, 10, 20) ; pcm.affiche () ; int n ; cin >> n ; }

Hritage multiple en C++

ENS Marrakech 2010/2011

Page 11

Conclusion

Hritage multiple en C++

Comme on a vue C++ dispose de possibilits dhritage multiple. Il sagit l dune gnralisation consquente, dans la mesure o elle permet de saffranchir de la contrainte hirarchique impose par lhritage simple. Malgr tout, son usage reste assez peu rpandu. La principale raison rside certainement dans les difficults quil implique au niveau de la conception des logiciels. Il est, en effet, plus facile de structurer un ensemble de classes selon un ou plusieurs arbres (cas de lhritage simple) que selon un simple graphe orient sans circuit (cas de lhritage multiple).

ENS Marrakech 2010/2011

Page 12

Bibliographie

Hritage multiple en C++

COLE POLYTECHNIQUE FDRALE DE LA USANNE cour de Jamila Sam Haroud. Claude Delannoy Apprendre le C++ dition EYROLLES Vincent Tkindt PROGRAMMATION EN C++ ET GNIE LOGICIEL dition DUNOD

ENS Marrakech 2010/2011

Page 13