SlideShare une entreprise Scribd logo
1  sur  6
Télécharger pour lire hors ligne
Chapitre X
Héritage multiple
• On parle d'héritage multiple lorsqu'une classe dérivée admet plusieurs classes de base
directes.
• L'héritage multiple est une généralisation de l'héritage simple. La plupart des résultats
et les notions mentionnés dans l'héritage simple restent valables pour l'héritage
multiple (En effet si T dérive de deux classes A et B, alors T est une classe dérivée de
A (resp de B) dans le sens de l'héritage simple). Cependant, quelques problèmes qui
n'existaient pas dans l'héritage simple apparaissent :
♦ Conflits entre identificateurs des membres hérités
♦ Duplication des membres
♦ Conflits d'initialisations des constructeurs des différentes classes de base
X.1 Un exemple d'héritage multiple
• Notons premièrement que si une classe T hérite de plusieurs classes A, B, …
class T : mode_a A, mode_b B,…
{… …};
où mode_a (mode_b, …) désigne le mode d'héritage (public, protégé ou
public)
Héritage multiple 100
le constructeur de T doit fournir les paramètres nécessaires à tous les constructeurs de
ses classes de base. Pour cela on utilise la syntaxe suivante:
T::T(… …) : A(…), B(…),…
De plus, avant tout appel du constructeur de T, il y aura appel des constructeurs de
classes de base suivant l'ordre de la liste des classes de base qui figure dans l'entête de
T. L'appel des destructeurs se fait dans l'ordre inverse.
Exemple 10.1 : (EXP10_01.CPP)
L'exemple suivant montre le cas d'un héritage multiple. On y définit deux classes point et
couleur, et une classe pointcol qui dérive de ces deux classes :
#include <iostream>
using namespace std;
// ------------------- Classes de base
class point{
protected:
int x;
int y;
public:
point(int, int);
~point();
void affiche_point();
};
point::point(int abs, int ord){
x = abs; y = ord;
cout << "--- constr de point" << endl;
}
point::~point(){
cout << "--- destr de point " << endl;
}
void point::affiche_point(){
cout << "(" << x << "," << y << ")";
}
class couleur{
protected:
unsigned int _couleur;
public:
couleur(unsigned int);
~couleur();
void affiche_couleur();
};
couleur::couleur(unsigned int c){
_couleur = c;
cout << "--- constr de couleur" << endl;
}
couleur::~couleur(){
cout << "--- destr de couleur " << endl;
}
void couleur::affiche_couleur(){
cout << "(" << _couleur << ")";
}
// ------------------- Classe derivée
class pointcol: public point, public couleur
{
public:
pointcol(int, int, unsigned int);
Héritage multiple 101
~pointcol();
};
pointcol::pointcol(int abs, int ord, unsigned int c):point(abs,ord),
couleur(c)
{
cout << "--- constr de pointcol" << endl;
}
pointcol::~pointcol(){
cout << "--- destr de pointcol" << endl;
}
//--------------------- TEST
int main()
{
pointcol a(1,2,3);
a.affiche_point();
cout << " - ";
a.affiche_couleur();
cout << endl;
return 0;
}
►Sortie du programme
--- constr de point
--- constr de couleur
--- constr de pointcol
(1,2) - (3)
--- destr de pointcol
--- destr de couleur
--- destr de point
Notez l'ordre d'appel des constructeurs et des destructeurs.
X.2 Résolution des conflits entre identificateurs
• Etant donné une classe T qui hérite de deux classes A et B. Si un membre de B possède
le même identificateur que celui d'un membre de A, alors T possèdera deux membres
différents qui portent le même nom et tout accès à l'un de ces deux membres sera
ambiguë. Pour résoudre cette ambiguïté il faut utiliser l'opérateur de résolution de
portée :
class A {… float x; …}
class B {… int x; …}
class T: public A, public B {… …}
T u;
u.A::x; // fait référence au réel x défini dans A
u.B::x; // fait référence à l'entier x défini dans B
u.x // rejeté, ambiguïté
Exemple 10.2 : (EXP10_02.CPP)
Cet exemple reprend l'exemple précédent dans lequel on renomme les fonctions membres
affiche_point() et affiche_couleur() en affiche(). Dans ce cas le
programme test devient :
Héritage multiple 102
int main()
{
pointcol a(1,2,3);
a.point::affiche();
cout << " - ";
a.couleur::affiche();
cout << endl;
return 0;
}
X.3 Classes virtuelles
• Supposons qu'une classe T hérite de deux classes A et B et que ces deux classes
héritent d'une autre classe C :
T hérite donc deux fois de C par l'intermédiaire de A et de B. Autrement dit, si A et B
hérite de C un membre nommé x, la classe T aura deux membres nommés x, (un
hérité de A et l'autre hérité de B) qui désignent la même donnée. Dans ce cas pour
accéder à ce membre dans T, on doit spécifier le chemin complet suivant
l'arborescence de l'héritage :
T u;
u.A::C::x; // fait référence à x hérité de C via A
u.B::C::x; // fait référence à x hérité de C via B
Or ceci n'est pratique ni efficace, en plus généralement une seule copie du membre x
est suffisante.
• Pour résoudre ce problème, on déclare virtuelle la classe de base commune C dans la
spécification de l'héritage de A et B comme suit :
class C {… …};
class A : public virtual C
{… …};
class B : public virtual C
{… …};
class T: public A, public B {… …}
dans ce cas, le compilateur n'incorpore qu'une seule copie des membres hérités de C
dans T et l'accès à ces membres se fera son l'utilisation de l'opérateur de résolution de
portée.
• Cependant, il faut noter que :
♦ Le constructeur d'une classe qui hérite directement ou indirectement d'une
classe virtuelle doit fournir les paramètres nécessaires au constructeur de cette
classe virtuelle. Dans le cas de notre exemple le constructeur de T doit fournir
les paramètres nécessaires au constructeur de C comme suit :
C
A
T
B
Héritage multiple 103
T::T(… …) : C(…), A(…), B(…)
♦ Si un membre de la classe de base virtuelle commune est redéfini dans une des
classes dérivées, c'est la définition de la classe dérivée qui prédomine. Si par
exemple fct() est une fonction membre de C qui est redéfinie dans B, alors
tout appel de cette fonction dans T ou avec une instance de T invoquera
B::fct().
Héritage multiple 104

Contenu connexe

Tendances (20)

Memo java
Memo javaMemo java
Memo java
 
Corrigés exercices langage C
Corrigés exercices langage CCorrigés exercices langage C
Corrigés exercices langage C
 
Tp1 compte rendu en langage c
Tp1 compte rendu en langage cTp1 compte rendu en langage c
Tp1 compte rendu en langage c
 
Ch03
Ch03Ch03
Ch03
 
Corrigé langage c
Corrigé langage cCorrigé langage c
Corrigé langage c
 
Csharp2014
Csharp2014Csharp2014
Csharp2014
 
algorithmique
algorithmiquealgorithmique
algorithmique
 
Exercice 1 java Héritage
Exercice 1 java HéritageExercice 1 java Héritage
Exercice 1 java Héritage
 
TP C++ : Correction
TP C++ : CorrectionTP C++ : Correction
TP C++ : Correction
 
Polymorphisme : un concept polymorphe !
Polymorphisme : un concept polymorphe !Polymorphisme : un concept polymorphe !
Polymorphisme : un concept polymorphe !
 
Aide mémoire de caml
Aide mémoire de camlAide mémoire de caml
Aide mémoire de caml
 
Chapitre 04 : les fonctions
Chapitre 04 : les fonctionsChapitre 04 : les fonctions
Chapitre 04 : les fonctions
 
Exercice 2 java Héritage
Exercice 2  java HéritageExercice 2  java Héritage
Exercice 2 java Héritage
 
Corrige tp java
Corrige tp javaCorrige tp java
Corrige tp java
 
Polymorphisme
PolymorphismePolymorphisme
Polymorphisme
 
Serie2
Serie2Serie2
Serie2
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Serie
SerieSerie
Serie
 
exercices en C
exercices en Cexercices en C
exercices en C
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
 

En vedette

En vedette (20)

Ojos Y Ordenador. Cuidados (Rsr)
Ojos Y Ordenador. Cuidados (Rsr)Ojos Y Ordenador. Cuidados (Rsr)
Ojos Y Ordenador. Cuidados (Rsr)
 
IRONIAS
IRONIASIRONIAS
IRONIAS
 
Brujas
BrujasBrujas
Brujas
 
Un buen proposito
Un buen propositoUn buen proposito
Un buen proposito
 
Demasiado Tarde
Demasiado TardeDemasiado Tarde
Demasiado Tarde
 
Teoria De La Ducha
Teoria De La DuchaTeoria De La Ducha
Teoria De La Ducha
 
Club LEO Santiago Tianguistenco
Club LEO Santiago TianguistencoClub LEO Santiago Tianguistenco
Club LEO Santiago Tianguistenco
 
Taller ALFIN UNESCO Sesion paralela ALFIN 2.0
Taller ALFIN UNESCO Sesion paralela ALFIN 2.0Taller ALFIN UNESCO Sesion paralela ALFIN 2.0
Taller ALFIN UNESCO Sesion paralela ALFIN 2.0
 
Questionnaire Results
Questionnaire ResultsQuestionnaire Results
Questionnaire Results
 
Atelier pratique : Analytics - Webassoc 14 avril 2015 - présentation
Atelier pratique : Analytics - Webassoc 14 avril 2015 - présentationAtelier pratique : Analytics - Webassoc 14 avril 2015 - présentation
Atelier pratique : Analytics - Webassoc 14 avril 2015 - présentation
 
Un adelanto del cielo
Un adelanto del cieloUn adelanto del cielo
Un adelanto del cielo
 
Historica granizada
Historica granizadaHistorica granizada
Historica granizada
 
Propuesta SMM Totus
Propuesta SMM TotusPropuesta SMM Totus
Propuesta SMM Totus
 
Termoel salud 2a jorn capacit matriz energ ex congr nac
Termoel salud 2a jorn capacit matriz energ ex congr nacTermoel salud 2a jorn capacit matriz energ ex congr nac
Termoel salud 2a jorn capacit matriz energ ex congr nac
 
L'imparfait
L'imparfaitL'imparfait
L'imparfait
 
Tenemos un plan_en_la_bus
Tenemos un plan_en_la_busTenemos un plan_en_la_bus
Tenemos un plan_en_la_bus
 
Medir en la web social: estrategia de marketing (29/02/2012)
Medir en la web social: estrategia de marketing (29/02/2012)Medir en la web social: estrategia de marketing (29/02/2012)
Medir en la web social: estrategia de marketing (29/02/2012)
 
Grabalo m
Grabalo mGrabalo m
Grabalo m
 
Monsanto
MonsantoMonsanto
Monsanto
 
Certificado CIADE
Certificado CIADECertificado CIADE
Certificado CIADE
 

Similaire à Ch10

Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdframadanmahdi
 
chapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfchapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfMoez Moezm
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objetsAziz Darouichi
 
Héritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierieHéritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierieMohammedAmineELHARCH1
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneMicrosoft
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCSiratiSoufiane
 
Chp6 - De UML vers C++
Chp6 - De UML vers C++Chp6 - De UML vers C++
Chp6 - De UML vers C++Lilia Sfaxi
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objetsAbdoulaye Dieng
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeAmir Souissi
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Rahma Boufalgha
 
Correction TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / TunisieCorrection TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / TunisieMariem ZAOUALI
 
Ebook matlab
Ebook matlabEbook matlab
Ebook matlabN NASRI
 
Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2Laurent BUNIET
 
TP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / TunisieTP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / TunisieMariem ZAOUALI
 

Similaire à Ch10 (20)

Ch06
Ch06Ch06
Ch06
 
Chap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdfChap 2--POO avec JAVA.pdf
Chap 2--POO avec JAVA.pdf
 
POO-chapitre3.pptx
POO-chapitre3.pptxPOO-chapitre3.pptx
POO-chapitre3.pptx
 
chapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdfchapitre4-HeritageetPolymorphisme.pdf
chapitre4-HeritageetPolymorphisme.pdf
 
Ch08
Ch08Ch08
Ch08
 
Chapitre5: Classes et objets
Chapitre5: Classes et objetsChapitre5: Classes et objets
Chapitre5: Classes et objets
 
Héritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierieHéritage dans cpp dev informatique ingenierie
Héritage dans cpp dev informatique ingenierie
 
Les nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ ModerneLes nouveautés de C++11 : Ecrire du C++ Moderne
Les nouveautés de C++11 : Ecrire du C++ Moderne
 
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CPP PTT DE CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 
Part1
Part1Part1
Part1
 
Chp6 - De UML vers C++
Chp6 - De UML vers C++Chp6 - De UML vers C++
Chp6 - De UML vers C++
 
Cpp2 : classes et objets
Cpp2 : classes et objetsCpp2 : classes et objets
Cpp2 : classes et objets
 
Cours c++
Cours c++Cours c++
Cours c++
 
generation_code.pdf
generation_code.pdfgeneration_code.pdf
generation_code.pdf
 
Chapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphismeChapitre 4 heritage et polymorphisme
Chapitre 4 heritage et polymorphisme
 
Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02Memojava 100604104941-phpapp02
Memojava 100604104941-phpapp02
 
Correction TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / TunisieCorrection TP4 Atelier C++ /GL2 INSAT / Tunisie
Correction TP4 Atelier C++ /GL2 INSAT / Tunisie
 
Ebook matlab
Ebook matlabEbook matlab
Ebook matlab
 
Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2
 
TP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / TunisieTP2 Atelier C++/ GL2 INSAT / Tunisie
TP2 Atelier C++/ GL2 INSAT / Tunisie
 

Plus de yarsenv47

Plus de yarsenv47 (11)

Js cours
 Js cours Js cours
Js cours
 
Algevre de bool
Algevre de boolAlgevre de bool
Algevre de bool
 
Numeration et codage_de_linfo
Numeration et codage_de_linfoNumeration et codage_de_linfo
Numeration et codage_de_linfo
 
S3 cours architectureord
S3 cours architectureordS3 cours architectureord
S3 cours architectureord
 
Ch13
Ch13Ch13
Ch13
 
Ch12
Ch12Ch12
Ch12
 
Ch11
Ch11Ch11
Ch11
 
Ch07
Ch07Ch07
Ch07
 
Ch05
Ch05Ch05
Ch05
 
Ch02
Ch02Ch02
Ch02
 
Language C++ Ch01
Language C++ Ch01 Language C++ Ch01
Language C++ Ch01
 

Ch10

  • 1. Chapitre X Héritage multiple • On parle d'héritage multiple lorsqu'une classe dérivée admet plusieurs classes de base directes. • L'héritage multiple est une généralisation de l'héritage simple. La plupart des résultats et les notions mentionnés dans l'héritage simple restent valables pour l'héritage multiple (En effet si T dérive de deux classes A et B, alors T est une classe dérivée de A (resp de B) dans le sens de l'héritage simple). Cependant, quelques problèmes qui n'existaient pas dans l'héritage simple apparaissent : ♦ Conflits entre identificateurs des membres hérités ♦ Duplication des membres ♦ Conflits d'initialisations des constructeurs des différentes classes de base X.1 Un exemple d'héritage multiple • Notons premièrement que si une classe T hérite de plusieurs classes A, B, … class T : mode_a A, mode_b B,… {… …}; où mode_a (mode_b, …) désigne le mode d'héritage (public, protégé ou public)
  • 2. Héritage multiple 100 le constructeur de T doit fournir les paramètres nécessaires à tous les constructeurs de ses classes de base. Pour cela on utilise la syntaxe suivante: T::T(… …) : A(…), B(…),… De plus, avant tout appel du constructeur de T, il y aura appel des constructeurs de classes de base suivant l'ordre de la liste des classes de base qui figure dans l'entête de T. L'appel des destructeurs se fait dans l'ordre inverse. Exemple 10.1 : (EXP10_01.CPP) L'exemple suivant montre le cas d'un héritage multiple. On y définit deux classes point et couleur, et une classe pointcol qui dérive de ces deux classes : #include <iostream> using namespace std; // ------------------- Classes de base class point{ protected: int x; int y; public: point(int, int); ~point(); void affiche_point(); }; point::point(int abs, int ord){ x = abs; y = ord; cout << "--- constr de point" << endl; } point::~point(){ cout << "--- destr de point " << endl; } void point::affiche_point(){ cout << "(" << x << "," << y << ")"; } class couleur{ protected: unsigned int _couleur; public: couleur(unsigned int); ~couleur(); void affiche_couleur(); }; couleur::couleur(unsigned int c){ _couleur = c; cout << "--- constr de couleur" << endl; } couleur::~couleur(){ cout << "--- destr de couleur " << endl; } void couleur::affiche_couleur(){ cout << "(" << _couleur << ")"; } // ------------------- Classe derivée class pointcol: public point, public couleur { public: pointcol(int, int, unsigned int);
  • 3. Héritage multiple 101 ~pointcol(); }; pointcol::pointcol(int abs, int ord, unsigned int c):point(abs,ord), couleur(c) { cout << "--- constr de pointcol" << endl; } pointcol::~pointcol(){ cout << "--- destr de pointcol" << endl; } //--------------------- TEST int main() { pointcol a(1,2,3); a.affiche_point(); cout << " - "; a.affiche_couleur(); cout << endl; return 0; } ►Sortie du programme --- constr de point --- constr de couleur --- constr de pointcol (1,2) - (3) --- destr de pointcol --- destr de couleur --- destr de point Notez l'ordre d'appel des constructeurs et des destructeurs. X.2 Résolution des conflits entre identificateurs • Etant donné une classe T qui hérite de deux classes A et B. Si un membre de B possède le même identificateur que celui d'un membre de A, alors T possèdera deux membres différents qui portent le même nom et tout accès à l'un de ces deux membres sera ambiguë. Pour résoudre cette ambiguïté il faut utiliser l'opérateur de résolution de portée : class A {… float x; …} class B {… int x; …} class T: public A, public B {… …} T u; u.A::x; // fait référence au réel x défini dans A u.B::x; // fait référence à l'entier x défini dans B u.x // rejeté, ambiguïté Exemple 10.2 : (EXP10_02.CPP) Cet exemple reprend l'exemple précédent dans lequel on renomme les fonctions membres affiche_point() et affiche_couleur() en affiche(). Dans ce cas le programme test devient :
  • 4. Héritage multiple 102 int main() { pointcol a(1,2,3); a.point::affiche(); cout << " - "; a.couleur::affiche(); cout << endl; return 0; } X.3 Classes virtuelles • Supposons qu'une classe T hérite de deux classes A et B et que ces deux classes héritent d'une autre classe C : T hérite donc deux fois de C par l'intermédiaire de A et de B. Autrement dit, si A et B hérite de C un membre nommé x, la classe T aura deux membres nommés x, (un hérité de A et l'autre hérité de B) qui désignent la même donnée. Dans ce cas pour accéder à ce membre dans T, on doit spécifier le chemin complet suivant l'arborescence de l'héritage : T u; u.A::C::x; // fait référence à x hérité de C via A u.B::C::x; // fait référence à x hérité de C via B Or ceci n'est pratique ni efficace, en plus généralement une seule copie du membre x est suffisante. • Pour résoudre ce problème, on déclare virtuelle la classe de base commune C dans la spécification de l'héritage de A et B comme suit : class C {… …}; class A : public virtual C {… …}; class B : public virtual C {… …}; class T: public A, public B {… …} dans ce cas, le compilateur n'incorpore qu'une seule copie des membres hérités de C dans T et l'accès à ces membres se fera son l'utilisation de l'opérateur de résolution de portée. • Cependant, il faut noter que : ♦ Le constructeur d'une classe qui hérite directement ou indirectement d'une classe virtuelle doit fournir les paramètres nécessaires au constructeur de cette classe virtuelle. Dans le cas de notre exemple le constructeur de T doit fournir les paramètres nécessaires au constructeur de C comme suit : C A T B
  • 5. Héritage multiple 103 T::T(… …) : C(…), A(…), B(…) ♦ Si un membre de la classe de base virtuelle commune est redéfini dans une des classes dérivées, c'est la définition de la classe dérivée qui prédomine. Si par exemple fct() est une fonction membre de C qui est redéfinie dans B, alors tout appel de cette fonction dans T ou avec une instance de T invoquera B::fct().