Vous êtes sur la page 1sur 15

1

CHAPITRE 4:
HÉRITAGE EN C++

1
INTRODUCTION

Une classe représente un concept : véhicule, voiture,
moteur, ...),

un concept peut être composé d'autres concepts → une
voiture est composée d'un moteur, de quatres roues, d'une
carrosserie, ...

L'héritage entre classes symbolise les relations
hiérarchiques entre les concepts : véhicule → voiture →
Peugeot → 308.

Si une classe B hérite d'une classe A, on dit alors que :
- A est la classe mère et B la classe fille,
- B dérive de A ou encore que B est dérivée de A. 2
2
INTRODUCTION

L'héritage est une relation de généralisation-spécialisation :
- B est une spécialisation de A
- A est une généralisation de B.

Ainsi le concept de voiture est une spécialisation du concept
plus général de véhicule : la classe voiture hérite donc de la
classe véhicule.

Si la classe B hérite de la classe A, elle hérite des attributs et
des méthodes de la classe A.

Ainsi un objet de la classe B est aussi un objet de la classe A

3
3
SYNTAXE GENERALE

class NomClasseDérivée : [public|private] ClasseBase1


{, [public|private] ClasseBaseI}1..n
{
//déclaration de classe
};

Exemple d’une classe B qui hérite d'une classe A :


class B : public A {
...
};
4
4
UTILISATION

int main() {
B b; // Déclaration d'un objet de la classe B
A a = b; // Construction d'un objet de classe A avec
// appel au constructeur de recopie de la classe A
A * ptra = &b; // pointeur sur un objet A auquel on affecte
// b un objet de type B
B * ptrb = &a; // Erreur
}

5
5
VISIBILITÉ DES ATTRIBUTS ET DES MÉTHODES

Si B hérite de A, B hérite des attributs et des méthodes de A.


La classe B ne peut pas accéder aux membres privés
(déclarés private) de la classe A.
Faut-il pour autant les déclarer public, au risque de violer le
principe d'encapsulation ? Non
Le C++ permet de déclarer des membres protégés
uniquement accessibles par les objets de la même classe et
par tous les objets des classes dérivées.
On utilise pour cela le mot clé protected.

6
6
VISIBILITÉ DES ATTRIBUTS ET DES MÉTHODES

Si B hérite de A, B hérite des attributs et des méthodes de A.

La classe B ne peut pas accéder aux membres privés
(déclarés private) de la classe A.

Faut-il pour autant les déclarer public, au risque de violer
le principe d'encapsulation ? Non

Le C++ permet de déclarer des membres protégés
uniquement accessibles par les objets de la même classe et
par tous les objets des classes dérivées.

On utilise pour cela le mot clé protected.

Pour écrire un code réutilisable, il est préférable en général
de déclarer les attributs en protected. 7
7
VISIBILITÉ DES ATTRIBUTS ET DES MÉTHODES (RÉSUMÉ)

3 types de visibilité :

les membres private ne sont accessibles que par la classe
elle-même.

les membres protected ne sont accessibles que la classe
elle-même et par toutes les classes dérivées.

les membres public sont accessibles par tous.

8
8
VISIBILITÉ DE LA CLASSE MÈRE

L'accès à la classe mère d'une classe peut être effectuée


partout dans le code → l'héritage public :
// Héritage public
class B : public A { ... };
On peut restreindre cet accès uniquement à la classe fille avec
le mot clé private → l'héritage privé :
// Héritage privé
class D : private A { ... };
Ou on peut restreindre à la classe fille et toute ses classes
dérivées avec le mot clé protected → héritage protégé
// Héritage protégé 9
9
class C : protected A { ... };
VISIBILITÉ DE LA CLASSE MÈRE

int main() {
B b; C c; D d;
A * ptr;

ptr = &B; // OK
ptr = &C; // Erreur A is an inaccessible base of C
ptr = &D; // Erreur A is an inaccessible base of D
}

Rque: Il est assez rare d'utiliser ce type d'héritage privé ou


protégé; 10
10
CONSTRUCTION/DESTRUCTION DES OBJETS DES CLASSES DÉRIVÉES


Le constructeur d’une classe dérivée appelle toujours les
constructeurs de ses classes mères avant de construire ses
propres attributs.
- l'appel du constructeur de la classe mère se fait
spécifiquement par le programmeur
- appel automatique du constructeur par défaut de la classe
mère. Si celui-ci n'existe pas, le compilateur envoie un
message d'erreur

Dans le cas de l'héritage multiple, on doit appeler les
constructeurs dans l'ordre de dérivation.

Les destructeurs des classes mères sont automatiquement 11
11
appelés par le destructeur de la classe fille.
LE MASQUAGE / DÉMASQUAGE

Quand on écrit une fonction qui a le même nom que celle
héritée de la classe mère, on parle de masquage.

La fonction héritée est alors masquée par par la fonction de
la classe fille et ainsi elle la remplace.

Si l’on désire appeler la fonction de la classe mère (qui est
masquée), on utilise l’opérateur de résolution de porté pour
la démasquer

12
12
LE MASQUAGE / DÉMASQUAGE
class A {

void draw() ; // fonction d’affichage
};
class B : public A {

void draw() ; //fct d’affichage (re)surdéfinie (masque celle de la classe A)
};
int main() {
B b;
b.draw() ; // appel de la fct draw de la classe B
b.A::draw() ; // appel de la fonction draw de la classe A (démasquage)
return 0 ;
} 13
13
A PROPOS DES CONSTRUCTEURS ET DU DESTRUCTEUR

Les constructeurs et le destructeurs ne sont jamais hérités.

toutes les autres méthodes peuvent être héritées et avoir un
comportement polymorphique si l’on souhaite.

14
14
RÉSUMÉ

L'héritage permet de spécialiser une classe.

Lorsqu'une classe hérite d'une autre classe, elle récupère toutes ses
propriétés et ses méthodes.

Faire un héritage a du sens si on peut dire que l'objet A « est un » objet B.
Par exemple, une Voiture « est un » Véhicule.

La classe de base est appelée classe mère et la classe qui en hérite est
appelée classe fille.

Les constructeurs sont appelés dans un ordre bien précis : classe mère, puis
classe fille.

En plus de public et private, il existe une portée protected. Elle est
équivalente à private mais elle est un peu plus ouverte : les classes filles
peuvent elles aussi accéder aux éléments déclarés protected.

Si une méthode a le même nom dans la classe fille et la classe mère, c'est
15
15
la méthode la plus spécialisée, celle de la classe fille, qui est appelée.