Vous êtes sur la page 1sur 7

C OLE POLY TEC H NI QUE

F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Informatique II :
Cours de programmation (C++)
Hritage multiple
Jamila Sam Haroud
Laboratoire dIntelligence Articielle
Facult e I&C
Informatique II Cours 10 : H eritage multiple 1
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Objectifs du cours daujourdhui

Introduire la notion dhritage multiple

Construction/destruction

Ambigut des attributs/mthodes hrits

Classes virtuelles
Informatique II Cours 10 : H eritage multiple 2
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Plan

Quest-ce que lhritage multiple?

Constructeurs et destructeurs dans une hirarchie multiple

Accs direct ambigu des attributs/mthodes hrits

Classes virtuelles
Informatique II Cours 10 : H eritage multiple 3
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Quest-ce que lhritage multiple
En C++, une sous-classe peut hriter de plusieurs super-classes :
Classe A Classe B
Classe C
Comme pour lhritage simple, la sous-classe hrite des super-classes :

tous leurs attributs et mthodes (sauf les constructeurs/destructeurs)

leur type
Informatique II Cours 10 : H eritage multiple 4
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Exemple
Un exemple zoologique :
Vivipare Ovipare
Ovovivipare
Informatique II Cours 10 : H eritage multiple 5
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Exemple (2)
.. et un exemple informatique :
ios
ostream
iostream
ifstream
ofstream
fstream
istream
Informatique II Cours 10 : H eritage multiple 6
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Hritage multiple
Syntaxe :
class nomSousClasse: [public] nomSuperClasse1, ...
[public] nomSuperClasseN {
//...
};
Exemple :
class Ovovivipare: public Ovipare, public Vivipare {
public:
Ovovivipare(unsigned int, unsigned int);
virtual Ovovivipare();
protected:
bool espece rare;
};

il ny pas de restriction sur le nombre de super-classes dont la


sous-classe peut hriter

lordre de dclaration des super-classes est pris en compte lors


de linvocation des constructeurs/destructeurs
Informatique II Cours 10 : H eritage multiple 7
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Plan

Quest-ce que lhritage multiple?

Constructeurs et destructeurs dans une hirarchie multiple

Accs direct ambigu des attributs/mthodes hrits

Classes virtuelles
Informatique II Cours 10 : H eritage multiple 8
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Constructeurs/destructeurs
Comme pour lhritage simple, linitialisation des attributs hrits doit
tre faite par invocation des constructeurs des super-classes :
Syntaxe :
SousClasse(liste de param`etres)
: SuperClasse1(arguments1),
...
SuperClasseN(argumentsN),
attribut1(valeur1),
...
attributK(valeurK)
{}
Lorsque lune des super-classes admet un constructeur par dfaut, il
nest pas ncessaire de linvoquer explicitement.
Informatique II Cours 10 : H eritage multiple 9
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Constructeurs/destructeurs (2)
Attention ! Lexcution des constructeurs des super-classes se fait
selon lordre de la dclaration dhritage, et non selon lordre des
appels dans le constructeur !
Lordre des appels des destructeurs de super-classes est linverse de
celui des appels de constructeurs
Informatique II Cours 10 : H eritage multiple 10
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Constructeurs/destructeurs (3)
Exemple :
class Ovovivipare : public Ovipare, public Vivipare {
public:
Ovovivipare(unsigned int, unsigned int);
virtual Ovovivipare();
protected:
bool espece rare;
};
Ovovivipare::Ovovivipare(unsigned int nb oeufs,
unsigned int duree gestation)
: Vivipare(duree gestation),
Ovipare(nb oeufs),
espece rare(false)
{}

Ordre dinvocation des constructeurs : Ovipare(), puis


Vivipare() puis le corps de Ovovivipare()

Ordre dinvocation des destructeurs : Ovovivipare(), puis


Vivipare, puis Ovipare
Informatique II Cours 10 : H eritage multiple 11
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Plan

Quest-ce que lhritage multiple?

Constructeurs et destructeurs dans une hirarchie multiple

Accs direct ambigu des attributs/mthodes hrits

Classes virtuelles
Informatique II Cours 10 : H eritage multiple 12
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Accs direct ambigu
Comme dans le cas de lhritage simple, une sous-classe peut
accder directement aux attributs et mthodes protgs de ses
super-classes
... et si ces attributs/mthodes portent le mme nom
dans plusieurs super-classes ?
public:
...};
void (ostream&) const; afficher
?
?
Ovovivipare o;
...
}
int main() {
o.
class Vivipare {
public:
...};
void (ostream&) const; afficher
class Ovipare {
...
};
class Ovovivipare : public Vivipare,
public Ovipare {
afficher(cout);
Informatique II Cours 10 : H eritage multiple 13
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Accs direct ambigu (2)
Attention ! laccs o.afficher provoquera une erreur la
compilation mme si la mthode afficher navait pas les mmes
arguments dans les deux classes Ovipare et Vivipare!!!
(La raison est quen C++ il ny a surcharge que dans la mme porte. Ici ce
nest pas une problme de surcharge mais un problme de rsolution de
porte)
Premire solution : utiliser loprateur de rsolution de porte.
int main(){
Ovovivipare o;
o.Vivipare::afficher();
...
mais...
Informatique II Cours 10 : H eritage multiple 14
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Accs direct ambigu (3)
mais...
Lutilisation de loprateur de rsolution de porte pour rsoudre les
ambiguts de noms des attributs/mthodes nest pas une bonne
solution :
cest lutilisateur de la classe Ovovivipare qui dcide du
fonctionnement correct de cette classe,
alors que cette responsabilit doit normalement incomber aux
concepteurs de la classe
Informatique II Cours 10 : H eritage multiple 15
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Accs direct ambigu Solution
Une des solutions consiste lever lambigut en indiquant
explicitement quelle(s) mthode(s) on souhaite invoquer
Il faut ajouter la liste des dclarations des mthodes/attributs de la
sous-classe, une dclaration spciale indiquant quel(s)
mthode(s)/attribut(s) seront invoqu(s) exactement
Syntaxe :
using NomSuperClasse::NomAttributOuMethodeAmbigu
Exemple :
class Ovovivipare : public Ovipare, public Vivipare {
public:
using Vivipare::afficher;
...
};
Attention ! pas de parenthses (ni prototypes) derrire les noms de
mthodes dans un using!
Informatique II Cours 10 : H eritage multiple 16
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Accs direct ambigu Solution (2)
Une autre bonne solution consiste incorporer dans la sous-classe
une mthode dnissant la bonne interprtation de linvocation
ambigu.
Exemple :
class Ovovivipare: public Ovipare, public Vivipare {
public:
Ovovivipare(unsigned int, unsigned int);
virtual Ovovivipare();
void afficher(ostream& out){
Ovipare::afficher(out);
out << " mais aussi ";
Vivipare::afficher(out);
}
protected:
bool espece rare;
};
Informatique II Cours 10 : H eritage multiple 17
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Plan

Quest-ce que lhritage multiple?

Constructeurs et destructeurs dans une hirarchie multiple

Accs direct ambigu des attributs/mthodes hrits

Classes virtuelles
Informatique II Cours 10 : H eritage multiple 18
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Classes virtuelles
Il peut se produire quune super-classe soit incluse plusieurs fois dans
une hirarchie hritage multiple :
Vivipare Ovipare
Ovovivipare
Animal Animal
Les attributs/mthodes de la super-classe seront inclus plusieurs fois !

Chaque objet de la classe Ovovivipare possdera deux copies


des attributs de la classe Animal.
Informatique II Cours 10 : H eritage multiple 19
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Classes virtuelles (2)
Pour viter la duplication des attributs dune super-classe plusieurs fois
incluse lors dhritages multiples, il faut dclarer son lien dhritage
avec toutes ses sous-classes comme virtuel
Cette super-classe sera alors dite virtuelle
( ne pas confondre avec classe abstraite!!)
Syntaxe :
class NomSousClasse: [public] virtual NomSuperClasseVirtuelle
Exemple :
class Ovipare: public virtual Animal {...};
...
class Vivipare: public virtual Animal {...};
Informatique II Cours 10 : H eritage multiple 20
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Classes virtuelles (3)
Vivipare Ovipare
Ovovivipare
Animal
Un seul objet de la super-classe Animal est hrit par lhritage
commun des sous-classes Ovipare et Vivipare.
Informatique II Cours 10 : H eritage multiple 21
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Constructeurs et Classes virtuelles
Dans une drivation non-virtuelle, le constructeur dune sous-classe
ne fait appel explicitement quaux constructeurs de ses super-classes
immdiates (et ceci rcursivement)
Dans une drivation virtuelle, la super-classe virtuelle est initialise
par sa classe la plus drive

La sous-classe la plus drive doit donc effectuer un appel au


constructeur de la super-classe virtuelle
Exemple :
Ovovivipare::Ovovivipare(string nom, Habitat habitat,
Regime regime, unsigned int nb oeufs,
unsigned int gestation,
bool espece rare)
: Animal(nom,habitat,regime),
Ovipare(nb oeufs),
Vivipare(gestation),
espece rare(false)
{}
Informatique II Cours 10 : H eritage multiple 22
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Constructeurs et Classes virtuelles (2)
Comment sont grs les appels au constructeurs de la super-classe
virtuelle ?
Si le constructeur dun objet de la classe la plus drive est invoqu,
les appels explicites au constructeur de la super-classe virtuelle dans
les classes intermdiaires sont ignors.
Si la super-classe virtuelle a un constructeur par dfaut, il nest pas
ncessaire de faire appel ce constructeur explicitement dans sa
classe la plus drive.
Si lappel explicite au constructeur de la super-classe virtuelle est omis
de la sous-classe la plus drive et si cette super-classe virtuelle na
pas de constructeur par dfaut, la compilation signalera une erreur.
Exemple...
Informatique II Cours 10 : H eritage multiple 23
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Constructeurs et Classes virtuelles (3)
Exemple :
Ovovivipare::Ovovivipare(string nom, Habitat habitat,
Regime regime, unsigned int nb oeufs,
unsigned int gestation,
bool espece rare)
: Animal(nom,habitat,regime),
Ovipare(nb oeufs),
Vivipare(gestation),
espece rare(espece rare)
{}

les appels explicites au constructeur de la classe Animal dans


les constructeurs de Ovipare et Vivipare sont ignors

si Animal avait un constructeur par dfaut, il nest pas ncessaire


de linvoquer explicitement dans le constructeur de Ovovivipare

si Ovovivipare ne fait pas appel explicitement au constructeur


de Animal et si Animal na pas de constructeur pas dfaut, il y
aura une erreur la compilation.
Informatique II Cours 10 : H eritage multiple 24
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Ordre des constructeurs/destructeurs
Dans une hirarchie de classes o il existe des super-classes
virtuelles :

le soin dinitialiser les super-classes virtuelles incombe la


sous-classe la plus drive

les constructeurs des super-classes virtuelles sont invoqus en


premier

ceux des classes non-virtuelles le sont ensuite dans lordre de


dclaration de lhritage

lordre dappel des constructeurs de copie est identique

lordre dappel des destructeurs est linverse de celui des appels


de constructeurs
Informatique II Cours 10 : H eritage multiple 25
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Hritage multiple
class nomSousClasse: [public] nomSuperClasse1, ...
[public] nomSuperClasseN
Collision de noms dattributs/mthodes : cest la sous-classe qui hrite
de ces attributs/mthodes qui doit dnir le sens de leur utilisation
Classe virtuelle : pour viter quune sous-classe hrite plusieurs fois
dune mme super-classe, il faut dclarer les drivations concernes
comme virtuelles
NomSousClasse: [public] virtual NomSuperClasseVirtuelle
Constructeur :
SousClasse(liste de parametres)
: SuperClasse1(arguments1),
...
SuperClasseN(argumentsN),
attribut1(valeur1)
...
attributK(valeurK)
{}
Cest la classe la plus drive qui initialise la super-classe virtuelle
Informatique II Cours 10 : H eritage multiple 26
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
Ce que jai appris aujourdhui

Quen C++ une sous-classe peut avoir plusieurs super-classes

Comment grer les collisions de noms dattributs et de mthodes


dans une hirarchie multiple

Ce quest une classe virtuelle et comment lutiliser


Informatique II Cours 10 : H eritage multiple 27
C OLE POLY TEC H NI QUE
F DRALE DE LAUSANNE
c EPFL 20022009
Jamila Sam
La suite

Des outils utiles en C++ : Standard Template Library

Rvisions
Informatique II Cours 10 : H eritage multiple 28