Vous êtes sur la page 1sur 15

Algorithmique/Langage

1re anne

Introduction l hritage
en C++
Yacine BELLIK
IUT dOrsay
Yacine.Bellik@iut-orsay.fr

Bibliographie

Ce cours est bas sur le livre suivant :


Programmer en C++, 5me dition mise jour,
Claude Delannoy, Editions Eyrolles

Yacine.Bellik@iut-orsay.fr

Qu'est ce que l'hritage ?


L'hritage consiste, partir d'une classe existante A, dfinir une nouvelle classe
B.
La classe existante A est appele classe mre, ou classe de base.
La nouvelle classe B est appel classe fille ou classe drive.
On dit que la classe B drive ou hrite de la classe A.
Une classe fille hrite automatiquement des donnes et mthodes de sa classe
mre sans avoir les rcrire.
Une classe mre peut avoir plusieurs classes filles.
Une classe fille peut elle mme servir de classe mre pour une autre classe fille.
On parle d hritage simple, quand une classe fille hrite d une seule classe mre.
On parle d hritage multiple, quand une classe fille hrite simultanment de
plusieurs classes mres.
Yacine.Bellik@iut-orsay.fr

Exemple
Classe
Vhicule

Classe
DeuxRoues

Classe
Vlo
Yacine.Bellik@iut-orsay.fr

Classe
Moto

Classe
QuatreRoues

Classe
Fourgonnette

Classe
Voiture
4

Utilit de l'hritage
L hritage permet de rutiliser des classes existantes.
L'hritage permet d'adapter des classes existantes ses propres besoins.
L'hritage permet de faire voluer les classes sans avoir les rcrire de A
Z.
L'hritage permet de modulariser les classes et de les spcialiser au fur et
mesure des besoins.
L'hritage permet d'viter de construire des classes de taille trop
importante.
Il n'est pas ncessaire de disposer du code source de la classe existante
pour en faire driver une classe fille. Il suffit simplement d'avoir le fichier de
dclaration de la classe mre ( fichier .h) et son fichier objet (fichier .o ou
fichier .lib).
Yacine.Bellik@iut-orsay.fr

Exemple
Soit la classe Point dclare dans le fichier "Point.h" suivant:
#ifndef _POINT_H_
#define _POINT_H_
class Point
{
protected :
int x,y;
public :
void initialiser (int abs,int ord);
void deplacer (int dx,int dy);
void afficher() const;
};
#endif

Nous verrons par la suite la signification de protected


Yacine.Bellik@iut-orsay.fr

Fichier Point.C
#include <iostream>
#include "Point.h"
using namespace std;
void Point::initialiser (int abs, int ord)
{
x=abs; y=ord;
}
void Point::deplacer (int dx, int dy)
{
x+=dx; y+=dy;
}
void Point::afficher() const
{
cout<<"Je suis en "<<x<<" "<<y<<endl;
}
Yacine.Bellik@iut-orsay.fr

Nouveaux besoins
La classe Point traite des points dnus de couleur. Supposons
qu'on ait besoin de traiter des points colors.
2 solutions sont possibles :
1. Modifier la classe Point
Ceci implique de disposer du fichier source "Point.C".
Les programmes qui utilisaient la classe Point risquent de ne plus
fonctionner si on les recompile avec la nouvelle version de la classe Point.

2. Driver une nouvelle classe PointCol partir de la classe Point


Il n'est pas ncessaire de disposer du fichier source "Point.C".
Il suffit de disposer du fichier "Point.h" et du fichier objet "Point.o".
Les programmes qui exploitaient la classe Point continueront de fonctionner
avec la mme la classe Point.

La 2me solution est meilleure


Yacine.Bellik@iut-orsay.fr

PointCol.h
#ifndef _POINTCOL_H_
#define _POINTCOL_H_
#include "Point.h"
class PointCol : public Point
{
protected :
int couleur;
public :
void colorer (int c);
};
#endif

Nous verrons par la suite la signification de protected


Yacine.Bellik@iut-orsay.fr

PointCol.C

#include "PointCol.h"
void PointCol::colorer (int c)
{
couleur=c;
}

Yacine.Bellik@iut-orsay.fr

10

Prog.C
#include "PointCol.h"
void main()
{
PointCol p;
p.initialiser(10,20); p.colorer(5);
p.afficher();
p.deplacer(2,4);
p.afficher();
};
Je suis en 10 20
Je suis en 12 24

Yacine.Bellik@iut-orsay.fr

11

Compilation et dition de liens


PointCol.h
PointCol.C
Point.h
Point.o

PointCol.o

Prog.C

Prog.o

Excutable
Yacine.Bellik@iut-orsay.fr

12

afficherCol
Comment faire pour afficher aussi la couleur ?
1re solution : ajouter dans la classe PointCol une mthode
afficherCol

void PointCol::afficherCol ( ) const


{
cout<<"je suis en "<< x <<" "<< y <<endl;
cout<<"
et ma couleur est : "<<couleur<<endl;
};

Yacine.Bellik@iut-orsay.fr

13

Utilisation des membres de la classe


de base dans une classe drive
On remarque que le premier traitement fait par afficherCol
(affichage des coordonnes) correspond au traitement fait
par la mthode afficher de la classe Point
Or on sait que la classe PointCol hrite des mthodes
publiques de sa classe mre Point.
On peut donc utiliser la mthode afficher dans la classe
PointCol
void PointCol::afficherCol () const
{
afficher( );
cout<<"
et ma couleur est : "<<couleur<<endl;
};
Yacine.Bellik@iut-orsay.fr

14

initialiserCol
La mme dmarche peut tre applique pour
initialiser un point color
void PointCol::initialiserCol (int abs, int ord, int coul)
{
initialiser(abs,ord);
couleur=coul;
};

Yacine.Bellik@iut-orsay.fr

15

PointCol.h
#ifndef _POINTCOL_H_
#define _POINTCOL_H_
#include "Point.h"
class PointCol : public Point
{
protected :
int couleur;
public :
void colorer (int c) { couleur=c;}
void afficherCol ( ) const;
void initialiserCol (int,int,int);
};
#endif
Yacine.Bellik@iut-orsay.fr

16

PointCol.C
#include <iostream>
#include "PointCol.h"
using namespace std;
void PointCol::afficherCol () const
{
afficher();
cout<<"
et ma couleur est : "<<couleur<<endl;
}
void PointCol::initialiserCol (int abs, int ord, int coul)
{
initialiser(abs,ord);
couleur=coul;
}
Yacine.Bellik@iut-orsay.fr

17

Prog.C
#include "PointCol.h"
void main()
{
PointCol p;
p.initialiserCol(10,20,5); p.afficherCol();
p.afficher();
p.deplacer(2,4);
p.afficherCol();
p.colorer(2);
p.afficherCol();
};
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
Yacine.Bellik@iut-orsay.fr

18

Redfinition des membres


dune classe drive
Conceptuellement, afficher et afficherCol ralisent le mme
traitement : affichage
il nest donc pas ncessaire dutiliser un nom diffrent pour
les mthodes daffichage dun point monochrome et dun
point color
Utiliser loprateur :: pour accder la mthode de la classe
mre

Yacine.Bellik@iut-orsay.fr

19

PointCol.h
#ifndef _POINTCOL_H_
#define _POINTCOL_H_
#include "Point.h"
class PointCol : public Point
{
protected :
int couleur;
public :
void colorer (int c) { couleur=c;}
void afficher () const;
void initialiser (int,int,int);
};
#endif

Yacine.Bellik@iut-orsay.fr

20

10

PointCol.C
#include <iostream>
#include "PointCol.h"
using namespace std;
void PointCol::afficher () const
{
Point::afficher();
cout<<"
et ma couleur est : "<<couleur<<endl;
}
void PointCol::initialiser (int abs,int ord, int coul)
{
Point::initialiser(abs,ord);
couleur=coul;
}
Yacine.Bellik@iut-orsay.fr

21

Prog.C
#include "PointCol.h"
void main()
{
PointCol p;
p.initialiser(10,20,5); p.afficher();
p.Point::afficher();
p.deplacer(2,4);
p.afficher();
p.colorer(2);
p.afficher();
};
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
Yacine.Bellik@iut-orsay.fr

22

11

Remarque
class A
{ public :
int a;
char b;
...
};

class B : public A
{ public :
float a;
...
};

B x;
int i=x.A::a;
float r=x.a;

Le mme principe sapplique aux donnes membres.


Yacine.Bellik@iut-orsay.fr

23

Les modificateurs daccs


il existe en fait 3 modificateurs daccs
private
Les membres privs dune classe, ne peuvent tre accds que par les
mthodes de cette mme classe (et les fonctions amies)

public
Les membres publiques dune classe, peuvent tre accds par tout le
monde (mthodes de cette mme classe, mthodes dautres classes et
fonctions externes, amies ou non amies)

protected

Le

Les membres protgs dune classe ne peuvent tre accds que par les
mthodes de cette mme classe, les fonctions amies et les mthodes des
classes directement drives.
Laccs par les mthodes des classes indirectement drives (une classe A
qui hrite dune classe B qui hrite dune classe C) dpendra du type de
lhritage. sapplique aux donnes membres.
mme principe

Yacine.Bellik@iut-orsay.fr

24

12

Les types d hritage


1. L hritage publique
class PointCol : public Point
{
...
};

Les membres publiques de la classe mre restent publiques


dans la classe fille.
Les membres protgs de la classe mre restent protgs
dans la classe fille.
Les membres privs de la classe mre sont inaccessibles.
Yacine.Bellik@iut-orsay.fr

25

Lhritage publique
Statut dans la

Nouveau statut

Accs par des


entits externes

fille

Accs par les


mthodes de la
classe fille

Public

Public

Oui

Oui

Protected

Protected

Oui

Non

L hritage
classe mrepublique
dans la classe

Les membres publiques de la classe mre restent publiques


Non
Non
dansPrivate
la classe fille.Private
Les membres protgs de la classe mre restent protgs
dans la classe fille.
Entits externes : mthodes dautres classes ou fonctions
Les membres
privs de la classe mre sont inaccessibles.
externes
(non amies)
Yacine.Bellik@iut-orsay.fr

26

13

Les types d hritage


2. L hritage protg
class PointCol : protected Point
{
...
};

Les membres publiques de la classe mre deviennent


protgs dans la classe fille.
Les membres protgs de la classe mre restent protgs
dans la classe fille.
Les membres privs de la classe mre sont inaccessibles.
Yacine.Bellik@iut-orsay.fr

27

Lhritage protg
Statut dans la
classe mre

Nouveau statut
dans la classe
fille

Accs par les


mthodes de la
classe fille

Accs par des


entits externes

Public

Protected

Oui

Non

Protected

Protected

Oui

Non

Private

Private

Non

Non

Yacine.Bellik@iut-orsay.fr

28

14

Les types d hritage


3. L hritage priv
class PointCol : private Point
{
...
};

Les membres publiques de la classe mre deviennent


privs dans la classe fille.
Les membres protgs de la classe mre deviennent privs
dans la classe fille.
Les membres privs de la classe mre sont inaccessibles.
Yacine.Bellik@iut-orsay.fr

29

Lhritage priv
L hritage
publique
Statut dans la
Nouveau statut
classe mre

dans la classe
fille

Accs par les


mthodes de la
classe fille

Accs par des


entits externes

Public

Private

Oui

Non

Protected

Private

Oui

Non

Les membres publiques de la classe mre restent publiques


dans la classe fille.
Private
Private de la classe
Nonmre restent
Non
Les membres
protgs
protgs
dans la classe fille.
Les membres privs de la classe mre sont inaccessibles.
Yacine.Bellik@iut-orsay.fr

30

15