web-dev-qa-db-fra.com

héritage virtuel

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;
56
Gal Goldman

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
43
ogee