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;
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;
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 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.