inheritance virtuel

Quelle est la signification de l’inheritancevirtuel“?

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’inheritance 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 créé le DDD (problème de dérivation de diamant), car vous ne pouvez pas appeler:

 Wrong wrong; wrong.Ambig(); 

C’est une fonction ambiguë car elle est définie deux fois:

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

Et:

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

Pour éviter ce genre de problème, vous devez utiliser l’inheritance virtuel, qui saura faire référence à la fonction Ambig() .

Donc – définir:

 class C : public virtual Base class D : public virtual Base class Right : public C, public D