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 mécanisme d'héritage, la classe C aura accès aux attributs m1 et m2 des classes A et B.

 De façon similaire à l'héritage simple, la déclaration d'une classe C héritant d'une classe A et d'une classe B s'écrira :

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


Constructeurs dans les classe dérivées


 Soit le fichier d'en-tête point.h :

// Spécification de la classe point
class point
{
private :
 float abscisse, ordonnee;

public :
 point (float, float);

 void afficher ();
};

 et le fichier d'en-tête forme.h :

// Spécification de la classe forme
class forme
{
private :
 char forme;

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




 On écrira la spécification de la classe pointforme dans le fichier d'en-tête pointforme.h comme ceci :

// Spécification de classe pointforme héritant des classes point et forme
class pointforme : public point, public forme
{
public :
 pointforme (float, float, char);

 void afficher ();
};

 Et enfin son implémentation dans le fichier source pointforme.cpp :

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

// Implémentation 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)
{
}

// Implémentation de la méthode afficher de la classe pointforme
void poinforme::afficher ()
{
 point::afficher ();
 forme::afficher ();
}


Un problème lié à l'héritage multiple




 En instanciant la classe D, l'objet va se retrouver, par le mécanisme d'héritage, avec une double représentation de la classe A par le biais des classes B et C. On peut schématiser le résultat obtenu par le graphe d'héritage 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 représentation suivante :





  Retour en haut de page Page suivante