57 votes

héritage virtuel

Que signifie l'héritage "virtuel" ?

J'ai vu le code suivant, et je n'ai pas compris la signification du mot-clé virtual dans le contexte suivant :

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

44voto

ogee Points 318

L'héritage virtuel est utilisé pour résoudre le problème de la DDD (Dreadful Diamond on Derivation).

Regardez l'exemple suivant, où vous avez deux classes qui héritent de la même classe de base :

class Base
{

public:

 virtual void  Ambig();

};

class C : public Base
{

public:

//...

};

class D : public Base
{
public:

    //...

};

Maintenant, vous voulez créer une nouvelle classe qui hérite à la fois des classes C et D (qui ont toutes deux hérité de la fonction Base::Ambig()) :

class Wrong : public C, public D
{

public:

...

};

Alors que vous définissez la classe "Wrong" ci-dessus, vous avez en fait créé le DDD (Diamond Derivation problem), car vous ne pouvez pas appeler :

Wrong wrong;
wrong.Ambig(); 

Il s'agit d'une fonction ambiguë car elle est définie deux fois :

Wrong::C::Base::Ambig()

Et :

Wrong::D::Base::Ambig()

Afin d'éviter ce genre de problème, il faut utiliser l'héritage virtuel, qui saura se référer à la bonne Ambig() fonction.

Donc - définir :

class C : public virtual Base

class D : public virtual Base

class Right : public C, public D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X