Chap-4 HéritagePartie1
Chap-4 HéritagePartie1
Chap-4 HéritagePartie1
Chap-4 : Héritage
Kamel Hamrouni
Abir Gallas
Introduction
L’héritage appelé aussi dérivation est un principe de la POO
permettant de créer une nouvelle classe à partir d’une classe
existante tout en profitant des attributs et des méthodes de
cette dernière et en définissant de nouveaux attributs et de
nouvelles méthodes propres à la classe dérivée. Par cette
méthode on crée une hiérarchie de classes de plus en plus
spécialisées. Cela a un avantage majeur de ne pas partir
toujours de zéro dans la conception d’applications.
La hiérarchie des classes constituée est aussi appelée
arborescence des classes. Au niveau de chaque nœud de
l’arborescence existe une relation de parenté. Le nœud est
appelé classe de base, ou classe parent, ou classe ancêtre, ou
classe père ou classe mère… et les classes dérivées sont
appelés classes filles ou sous-classes.
2
Introduction (2)
Exemple
3
Introduction (3)
4
Héritage Simple
Mode de
dérivation
Classe
mère
Classe
dérivée La classe B hérite de façon publique de
la classe A. Tous les membres publics ou
protégés de la classe A font partie de
l’interface de la classe B.
5
Mode de Dérivation
6
Mode de Dérivation (2)
Le mode de dérivation constitue donc une sorte de filtre dans le processus
de dérivation :
Les données seront ou non accessibles par la classe fille et les classes
petites filles.
Les membres privés ne sont jamais accessibles par les membres de la
classe dérivée.
Le mode de dérivation ne concerne donc que les membres protected ou
public.
En mode de dérivation public, le statut d’un membre reste inchangé : un
membre public reste public et un membre protected reste protected.
En mode de dérivation protected, le statut d’un membre devient protected.
En mode de dérivation private, le statut d’un membre devient private.
C’est à dire qu’il sera considéré dans la classe dérivée comme un membre
private donc inaccessible par les classes petites filles.
7
Mode de Dérivation (3)
Si le mode de dérivation n’est pas spécifié, le compilateur prend par
défaut le mode private pour une classe et public pour une structure.
Le tableau suivant résume le statut des membres selon le mode de
dérivation :
8
Héritage « public »
C’est le mode d’héritage le plus courant. Il donne aux membres public et
protected, le même statut dans la classe dérivée.
Exemple
9
Héritage « protected »
Le mode protected donne aux membres public et protected, le statut protected
dans la classe dérivée.
Exemple
10
Héritage « private »
Le mode private donne aux membres public et protected, le statut private
dans la classe dérivée.
Exemple
11
Redéfinition de méthodes dans la classe
dérivée
12
Héritage de constructeurs\destructeurs
13
Héritage de constructeurs\destructeurs (2)
Exemple 1
Ce programme affiche:
Const. de la classe A
Const. de la classe B
Dest. de la classe B
Dest. de la classe A
14
Héritage de constructeurs\destructeurs (3)
Exemple 2 : Appel du constructeur avec paramètres
15
Héritage et amitié
16
Conversion de type dans une hiérarchie
de classes
Conversion de variable
17
Opérateurs de conversion (3)
Exemple
void traitement1(Vehicule v)
class Vehicule { // ...
{ public: v.f1(); // OK
void f1(); // …
}
// ...
void main()
}; {
class Voiture : public Vehicule Voiture R25;
{ public: traitement1( R25 );
int f1(); // R25 est automatiquement
//converti en une instance de la
} //classe Vehicule
}
18
Conversion de type dans une hiérarchie
de classes (2)
Conversion de pointeur
19
Conversion de type dans une hiérarchie
de classes (3)
Exemple
C’est le type du pointeur qui détermine laquelle des méthodes f1( )
est appelée
20
Héritage multiple
21
Héritage multiple (2)
Exemple
class A class C: public B, public A
{ public: { int c;
void fa() { /* ... */ } public:
protected: void fc();
int a; };
};
class B void C::fc()
{ public: { int i;
void fb() { /* ... */ } fa( );
protected: i = a + b;
int b; }
};
22
Héritage multiple (3)
23
Héritage multiple (4)
Exemple class C: public B, public A
class A // ordre d’appel des constructeurs
{ public: { public:
C(int i, int j) : A(i) , B(j)
A(int n=0) { /* ... */ }
{ /* ... */ }
// ... // liste d’initialisation
}; // ...
class B };
void main()
{ public:
{ C objet_c;
B(int n=0) { /* ... */ } // appel des constructeurs
// ... //B(), A() et C()
}; // ...
}
Les destructeurs sont appelés dans l’ordre inverse de celui des constructeurs.
24