Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
L’héritage multiple
class A { ... } ; A B
class B { ... } ;
class C : public A, public B { ... } ;
C
FFigure 1
int main()
{
HM hm;
hm.affiche() // erreur de compilation car ambigu.
}
HM::affiche()
{
A :: affiche() ; // et / ou B :: affiche() ;
}
A A
10.2 Héritage 2 fois de la même classe
B C
HM
Figure 2
class A { protected : int k ; ... } ;
class B : public A { ... } ;
class C : public A { ... } ;
class HM : public B, public C { ... } ; // hérite 2 fois de k venant de A
void HM :: affiche()
{
cout << k; // ambigu, quel k ?
Page 1 sur 4
}
void HM :: affiche()
{
cout << k; // ok
}
A
B C
HM
Figure 3
A est déclaré classe de base virtuelle. Les éléments de la classe de base virtuelle ne sont
insérés qu’une seule fois dans la classe dérivée.
Et les constructeurs des classes de base virtuelles sont appelés avant les constructeurs des
classes de bases non virtuelles, enfin le constructeur de la classe dérivée.
Page 2 sur 4
Type abstrait de Structure de données
données fondamentales
Pile
File
Ensemble
Figure 4
Le type abstrait de données ne contient que des des fonctions membres virtuelles pures.
Qui sont implémentées dans la classe dérivée à l'aide d'une structure de données
fondamentales.
Class EnsembleAbstrait {
public :
virtual void ajouter( int ) = 0 ;
virtual void enlever ( int ) = 0 ;
virtual void contient ( int ) = 0 ;
};
Class Tableau {
....
};
soit la fonction f :
void f (EnsembleAbstrait &e )
{
e.ajouter() ;
e.enlever() ;
...
}
Page 3 sur 4
10.5 En conclusion
L’héritage multiple est plaisant d’un point de vue conceptuel, mais pose d’énormes
problèmes de maintenance et de conflit.
Page 4 sur 4