Introduction
L'héritage consiste à dériver une classe à partir d'une autre classe de base.
On dit que la classe B hérite de la classe A, ou B est une classe fille de la classe A, ou encore A
est une classe parente de la classe B etc...
Toute classe B, héritant d'une classe A, accède à l'ensemble des déclarations de A sous certaines
conditions :
|
public : accessible par tout le monde (membres de la classe, classes dérivées et clients de la classe)
protected : accessible par les membres de la classe et par les classes dérivées
private : accessible par les membres de la classe uniquement
|
Classe dérivées publiques
La spécification d'une classe B héritant de A s'écrira :
class B : public A
{
...
};
|
Exemple :
class point
{
private :
float abscisse, ordonnee;
public :
void point (float, float);
void afficher();
};
class dpoint : public point
{
public :
void deplacer (float, float);
}
|
Implémentation :
#include "point.h"
#include "dpoint.h"
void dpoint::deplacer (float x, float y)
{
abscisse = abscisse + x;
ordonnee = ordonnee + y;
}
|
Les attributs
abscisse et
ordonnee sont déclarés dans la partie
privée de la classe
point. Pour les rendre accessibles à la classe
dpoint il
faut donc remplacer
private par
protected :
class point
{
protected :
float abscisse, ordonnee;
public :
void point (float, float);
void afficher ();
};
|
Programme client de dpoint :
#include "point.h"
#include "dpoint.h"
void main ()
{
dpoint p;
p.point (5.0, 6.5);
p.deplacer (8.0, 11.5);
p.afficher ();
}
|
Constructeur dans les classes dérivées
class pointforme : public point
{
private :
char forme;
public :
pointforme (float, float, char);
void deformer (char);
void afficher ();
};
pointforme::pointforme (float x, float y, char f) : point (x, y)
{
forme = f;
}
void pointforme::afficher ()
{
point::afficher ();
cout << "forme : " << forme << "\n";
}
pointforme p(3.5, 6.2, '*');
|
Fonctions et classes "amies"
La protection des attributs ou des méthodes d'une classe (
private,
protected)
peut parfois poser problème lors de son utilisation. Il peut être intéressant d'avoir accès à ses membres privés
et protégés depuis l'extérieur (pour un certain nombre de fonctions ou de classes) sans pour autant perdre cette
protection pour le reste du programme.
Ceci est tout à fait possible en utilisant la notion de fonction "amie" ou de classe "amie". Le mot
clé utilisé est
friend. C'est dans la classe permettant l'accès à ses informations que l'on
déclarera les fonctions ou les classes amies.
class point
{
private :
float abscisse, ordonnee;
public :
point (float, float);
friend class utilisepoint;
friend void modifierAbscisse (point, float);
friend void modifierOrdonnee (point, float);
};
class utilisepoint
{
private :
float x, y;
public :
utilisepoint (point);
};
point::point (float x, float y)
{
abscisse = x;
ordonnee = y;
}
utilisepoint::utilisepoint (point p)
{
x = p.abscisse;
y = p.ordonnee;
}
void modifierAbscisse (point p, float x)
{
p.abscisse = x;
}
void modifierOrdonnee (point p, float y)
{
p.ordonnee = y;
}
void main ()
{
point p(2,3);
modifierAbscisse (p, 5);
modifierOrdonnee (p, 10);
utilisepoint p2(p);
}
|