it-swarm.com.de

virtuelle Vererbung

Was bedeutet "virtuelle" Vererbung?

Ich habe den folgenden Code gesehen und die Bedeutung des Schlüsselworts virtual im folgenden Kontext nicht verstanden:

class A {};
class B : public virtual A;
56
Gal Goldman

Die virtuelle Vererbung wird verwendet, um das DDD-Problem (Dreadful Diamond on Derivation) zu lösen.

Schauen Sie sich das folgende Beispiel an, in dem Sie zwei Klassen haben, die von derselben Basisklasse erben:

class Base
{

public:

 virtual void  Ambig();

};

class C : public Base
{

public:

//...

};

class D : public Base
{
public:

    //...

};

Jetzt möchten Sie eine neue Klasse erstellen, die sowohl von C- als auch von D-Klassen erbt (die beide die Base :: Ambig () - Funktion geerbt haben):

class Wrong : public C, public D
{

public:

...

};

Während Sie oben die Klasse "Wrong" definiert haben, haben Sie tatsächlich das DDD (Diamond Derivation-Problem) erstellt, da Sie Folgendes nicht aufrufen können:

Wrong wrong;
wrong.Ambig(); 

Dies ist eine mehrdeutige Funktion, da sie doppelt definiert ist:

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

Und:

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

Um diese Art von Problem zu vermeiden, sollten Sie die virtuelle Vererbung verwenden, die bekanntermaßen auf die richtige Ambig() -Funktion verweist.

Also - definiere:

class C : public virtual Base

class D : public virtual Base

class Right : public C, public D
43
ogee