Exood4 Studio - Video Game Development, Toulouse (France)
Exood4 Studios Exood4 Tutorials

   
L a n g a g e   C++

L ' h é r i t a g e   s i m p l e






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 :

// Déclaration de la classe point
class point
{
private :
 float abscisse, ordonnee;

public :
 void point (float, float);
 void afficher();
};

// Déclaration de la classe dpoint héritant de la classe point
class dpoint : public point
{
public :
 void deplacer (float, float);
}

 Implémentation :

#include "point.h"
#include "dpoint.h"

// Définition de la méthode deplacer de la classe dpoint
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 :

// Déclaration de la classe point
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




// Déclaration de la classe pointforme
class pointforme : public point
{
private :
 char forme;

public :
 pointforme (float, float, char); // constructeur de la classe pointforme

 void deformer (char);
 void afficher ();
};

// Définition du constructeur de la classe pointforme en appelant celui de la classe point
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, '*'); // utilisation du constructeur de la classe pointforme


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.

// Déclaration de la classe point
class point
{
private :
 float abscisse, ordonnee;

public :
 point (float, float);

 friend class utilisepoint; // utilisepoint est une classe amie de la classe point

 friend void modifierAbscisse (point, float); // modifierAbscisse est une fonction amie
 // de la classe point

 friend void modifierOrdonnee (point, float); // modifierOrdonnee est une fonction amie
 // de la classe point
};

// Déclaration de la classe utilisepoint
class utilisepoint
{
private :
 float x, y;

public :
 utilisepoint (point);
};

// Définition du constructeur de la classe point
point::point (float x, float y)
{
 abscisse = x;
 ordonnee = y;
}

// Définition du constructeur de la classe utilisepoint à partir d'un objet de type point
utilisepoint::utilisepoint (point p)
{
 x = p.abscisse; // l'accès à abscisse et ordonnee est possible
 y = p.ordonnee; // car utilisepoint est une classe amie de point
}

// Définition de la fonction modifierAbscisse
void modifierAbscisse (point p, float x)
{
 p.abscisse = x; // l'accès à abscisse est possible car modifierAbscisse
 // est une fonction amie de la classe point
}

// Définition de la fonction modifierOrdonnee
void modifierOrdonnee (point p, float y)
{
 p.ordonnee = y; // l'accès à ordonnee est possible car modifierOrdonnee
 // est une fonction amie de la classe point
}

// Programme principal client des classes point et utilisepoint
void main ()
{
 point p(2,3);

 modifierAbscisse (p, 5);
 modifierOrdonnee (p, 10);

 utilisepoint p2(p); // p2 sera initialisé avec les valeurs 5 et 10
}



  Retour en haut de page Page suivante