1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| /* La classe ancêtre, celle dont toutes les autres héritent, peut etre en suivant
*deux chemins différents
*/
class Base
{
public:
Base(/*...*/);
virtual ~Base();
/* ...*/
};
/* les classes dérivant directement de la classe ancêtres, avec un héritage virtuel
* je montre un exemple avec deux, mais on peut en avoir plus ;)
*/
class Derivee1 : virtual Base
{
public:
Deriviee1(/* ... */ : Base(/*... */) // comme d'hab, on appel le constructeur
// de la classe parent ;)
/*...*/
};
class Derivee2 : virtual Base
{
public:
Deriviee2(/* ... */ : Base(/*... */) // comme d'hab, on appel le constructeur
// de la classe parent ;)
/*...*/
};
class Diamant : public Derivee1, public Derivee2
{
public:
/* du fait de l'héritage virtuel, la partie "ancêtre" (venue de Base)
* ne vient ni de Derivee1, ni de Derivee2, ou, plutot, ni le
* constructeur de Derivee1 ni celui de Derivee2 ne prend la responsabilité
* d'appeler celui de Base (bien qu'ils l'eussent fait si l'héritage n'avait
* pas été virtuel)... il faut donc non seulement appeler le constructeur
* des deux classes parent "directes", mais aussi celui de la classe ancêtre
*/
Diamant(/* ...*/): Base(/* ... */), Derivee1(/*...*), Derivee2(/*...*/)
{}
/* ...*/
}; |
Partager