Quelle est la signification de 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 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:
...
};
Pendant 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, vous devez utiliser l'héritage virtuel, qui saura se référer à la bonne fonction Ambig()
.
Donc - définissez:
class C : public virtual Base
class D : public virtual Base
class Right : public C, public D