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   m u l t i p l e






Introduction




 m1 : attribut de la classe A
 m2 : attribut de la classe B

 Par le mcanisme d'hritage, la classe C aura accs aux attributs m1 et m2 des classes A et B.

 De faon similaire l'hritage simple, la dclaration d'une classe C hritant d'une classe A et d'une classe B s'crira :

class C : public A, public B
{
 ...
};


Constructeurs dans les classe drives


 Soit le fichier d'en-tte point.h :

// Spcification de la classe point
class point
{
private :
 float abscisse, ordonnee;

public :
 point (float, float);

 void afficher ();
};

 et le fichier d'en-tte forme.h :

// Spcification de la classe forme
class forme
{
private :
 char forme;

public :
 forme (char);
 void afficher ();
};




 On crira la spcification de la classe pointforme dans le fichier d'en-tte pointforme.h comme ceci :

// Spcification de classe pointforme hritant des classes point et forme
class pointforme : public point, public forme
{
public :
 pointforme (float, float, char);

 void afficher ();
};

 Et enfin son implmentation dans le fichier source pointforme.cpp :

#include "point.h"
#include "forme.h"
#include "pointforme.h"

// Implmentation du constructeur de la classe pointforme
// en appelant celui des classes point et forme
pointforme::pointforme (float x, float y, char f) : point (x, y), forme (f)
{
}

// Implmentation de la mthode afficher de la classe pointforme
void poinforme::afficher ()
{
 point::afficher ();
 forme::afficher ();
}


Un problme li l'hritage multiple




 En instanciant la classe D, l'objet va se retrouver, par le mcanisme d'hritage, avec une double reprsentation de la classe A par le biais des classes B et C. On peut schmatiser le rsultat obtenu par le graphe d'hritage suivant :




Les classes virtuelles


 La solution pour obtenir une seule copie de la classe A en instanciant D est d'utiliser la notion de classe virtuelle :

class A
{
 ...
};

class B : public virtual A
{
 ...
};

class C : public virtual A
{
 ...
};

class D : public B, public C
{
 ...
};

 Ce qui correspond la reprsentation suivante :





  Retour en haut de page Page suivante