Chapitre 6 S3 SEIB 2020-2021
Chapitre 6 S3 SEIB 2020-2021
Chapitre 6 S3 SEIB 2020-2021
HÉRITAGE
Master SEIB
2020-2021
Azzedine DLIOU
Ecole Nationale des Sciences appliquées
Université Ibn Zohr
Plan
Introduction
Notion d’héritage
Utilisation des membres de la classe de base
dans une classe dérivée
Redéfinition des membres d’une classe
dérivée
Appel des constructeurs et des destructeurs
Contrôle des accès
Compatibilité entre classes base et dérivée
Introduction
Le concept d’héritage constitue l’un des
fondements de la P.O.O., il est à la base des
possibilités de réutilisation de composants
logiciels (en l’occurrence, de classes).
Il vous autorise à définir une nouvelle classe, dite
«dérivée», à partir d’une classe existante dite « de
base ».
La classe dérivée « héritera » des «potentialités»
de la classe de base, tout en lui en ajoutant de
nouvelles, et cela sans qu’il soit nécessaire de
remettre en question la classe de base.
Introduction
Cette technique permet de développer de
nouveaux outils en se fondant sur un certain
acquis, ce qui justifie le terme d’héritage.
Plusieurs classes pourront être dérivées d’une
même classe de base.
L’héritage n’est pas limité à un seul niveau : une
classe dérivée peut devenir à son tour classe de
base pour une autre classe.
La notion d’héritage se voit comme un outil de
spécialisation croissante.
C++ autorise, aussi, l’héritage multiple, grâce
auquel une classe peut être dérivée de plusieurs
classes de base.
Notion d’héritage
Soit la déclaration de la classe suivante :
class point {
int x ;
int y ;
public :
void initialise (int, int) ;
void deplace (int, int) ;
void affiche () const ;
};
Supposons que nous ayons besoin de définir un nouveau type
classe nommé pointcol, destiné à manipuler des points
colorés d’un plan.
Une telle classe peut disposer des mêmes fonctionnalités que
la classe point, auxquelles on pourrait adjoindre, par
exemple, une méthode nommée colore, chargée de définir la
couleur.
Notion d’héritage
La déclaration de pointcol peut être la suivante :
class pointcol : public point //pointcol dérive de point
{
short couleur ;
public :
void colore (short cl) { couleur = cl ; }
};
La déclaration :
class pointcol : public point
spécifie que pointcol est une classe dérivée de la classe de base
point.
Le mot public signifie que les membres publics de la classe de
base (point) seront des membres publics de la classe dérivée
(pointcol).
Il correspond à l’idée la plus fréquente que l’on peut avoir de
l’héritage, sur le plan général de la P.O.O.
Notion d’héritage
La classe pointcol peut déclarer des objets de type
pointcol de manière usuelle :
pointcol p, q ;
Je suis en 10 20
et ma couleur est : 5
Je suis en 10 20
Je suis en 12 24
et ma couleur est : 5
Je suis en 12 24
et ma couleur est : 2
Redéfinition des membres d’une classe
dérivée
Redéfinition et surdéfinition
• Soit les instructions suivantes :
class A { class B : public A {
public : public :
void f(int n) { ..... } void f(float x) { ..... }
void f(char c) { ..... } // on ajoute 3ème définition dans B
// f est surdéfinie dans A };
};
int main(){
int n ; char c ; A a ; B b ;
a.f(n) ; a.f(c) ; // appelle A:f(int) et A:f(char) (règles habituelles)
b.f(n) ;
// appelle B:f(float) (alors que peut-être A:f(int) conviendrait)
b.f(c) ;
// appelle B:f(float) (alors que peut-être A:f(char) conviendrait)
}
Redéfinition des membres d’une classe
dérivée
Redéfinition et surdéfinition : Explication
Remarques
1. Lorsqu’une classe dérivée possède des fonctions
amies, ces dernières disposent exactement des
mêmes autorisations d’accès que les fonctions
membres de la classe dérivée.
2. Les déclarations d’amitié ne s’héritent pas. Ainsi,
si f a été déclarée amie d’une classe A et si B
dérive de A, f n’est pas automatiquement amie de
B (il est bien sûr possible de prévoir une
déclaration d’amitié appropriée dans B).
Contrôle des accès
Dérivation publique : Rappels
Contrôle des accès
Dérivation privée
• En utilisant le mot-clé private au lieu du mot-clé public, il est possible
d’interdire à un utilisateur d’une classe dérivée l’accès aux membres
publics de sa classe de base.
• Par exemple :
class point class pointcol : private point
{ {
..... .....
public : public :
point (...) ; pointcol (...) ;
void affiche () ; void colore (...) ;
void deplace (...) ; ...
... };
};
• Si p est de type pointcol, les appels suivants seront rejetés par le
compilateur :
p.affiche (); /* ou même : p.point::affiche () */
p.deplace (...); /* ou même : p.point::deplace (...) */
alors que, naturellement, celui-ci sera accepté : p.colore (...);
Contrôle des accès
Dérivation privée
• Cette technique de fermeture des accès à la classe de
base ne sera employée que dans des cas bien précis, par
exemple :
o Lorsque toutes les fonctions utiles de la classe de
base sont redéfinies dans la classe dérivée et qu’il n’y a
aucune raison de laisser l’utilisateur accéder aux
anciennes ;
o Lorsque l’on souhaite adapter l’interface d’une classe
de manière à répondre à certaines exigences.
Contrôle des accès
Dérivation protégée
• C++ dispose d’une possibilité supplémentaire de dérivation,
dite dérivation protégée, intermédiaire entre la dérivation
publique et la dérivation privée.
• Dans ce cas, les membres publics de la classe de base seront
considérés comme protégés lors de dérivation ultérieures.
Remarques
1. Ne pas confondre le mode de dérivation d’une classe par rapport
à sa classe de base (publique, protégée ou privée), définie par l’un
des mots public, protected ou private, avec le statut des
membres d’une classe (public, protégé ou privé) défini également
par l’un de ces trois mots.
2. Dans le cas d’une dérivation privée, les membres protégés de la
classe de base restent accessibles aux fonctions membres et aux
fonctions amies de la classe dérivée. En revanche, ils seront
considérés comme privés pour une dérivation future.
Contrôle des accès
Récapitulation
• Voici un tableau récapitulant les propriétés des différentes sortes de
dérivation :
o La mention « Accès FMA » signifie : accès aux fonctions membres
ou amies de la classe ;
o La mention « nouveau statut » signifie : statut qu’aura ce
membre dans une éventuelle classe dérivée.
Remarque
Une dérivation protégée ne se distingue d’une dérivation privée que
lorsque l’on est amené à dériver de nouvelles classes de la classe
dérivée en question.
Compatibilité entre classes de base et
dérivée
Conversion d’un type dérivé en un type de base
• Soit les deux classes :
class point class pointcol : public point
{ ..... } { ..... }
• Avec les déclarations :
point a ;
pointcol b ;
l’affectation :
a=b;
est légale. Elle entraîne une conversion de b dans le type point
(cette conversion revient à ne conserver de b que ce qui est du type
point) et l’affectation du résultat à a.
• Cette affectation se fait, suivant les cas :
o Par appel de l’opérateur d’affectation (de la classe point) si
celui-ci a été surdéfini ;
o Par emploi de l’affectation par défaut dans le cas contraire.
• En revanche, l’affectation suivante serait rejetée :
b=a;
Compatibilité entre classes de base et
dérivée
Conversion de pointeurs
• Soit les deux classes :
class point class pointcol : public point
{ {
int x, y ; short couleur ;
public : public :
..... .....
void affiche () ; void affiche () ;
..... .....
}; };
• Soit ces déclarations :
point * adp ; pointcol * adpc ;
• Là encore, C++ autorise l’affectation : adp = adpc ;
qui correspond à une conversion du type pointcol * dans le type
point *.
• L’affectation inverse : adpc = adp ;
serait naturellement rejetée.
Compatibilité entre classes de base et
dérivée
Limitations liées au typage statique des objets
• Considérons les déclarations suivantes des classes précédentes :
point p (3, 5) ; pointcol pc (8, 6, 2) ;
adp = & p ; adpc = & pc ;
• La situation est alors celle-ci :
Je suis un point
mes coordonnees sont : 3 5
Je suis un point colore
mes coordonnees sont : 8 6 et ma couleur est : 2
-----------------
Je suis un point
mes coordonnees sont : 8 6
Je suis un point colore
mes coordonnees sont : 8 6 et ma couleur est : 2