75 Stimmen

virtuelle Vererbung

Was bedeutet die "virtuelle" Vererbung?

Ich habe den folgenden Code gesehen und die Bedeutung des Schlüsselworts nicht verstanden virtual in dem folgenden Zusammenhang:

class A {};
class B : public virtual A;

58voto

ogee Punkte 907

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

Im folgenden Beispiel haben Sie zwei Klassen, die von der gleichen Basisklasse erben:

class Base
{

public:

 virtual void  Ambig();

};

class C : public Base
{

public:

//...

};

class D : public Base
{
public:

    //...

};

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

class Wrong : public C, public D
{

public:

...

};

Während Sie die "Falsche" Klasse oben definieren, haben Sie tatsächlich das DDD (Diamond Derivation Problem) geschaffen, weil Sie nicht aufrufen können:

Wrong wrong;
wrong.Ambig(); 

Dies ist eine zweideutige Funktion, da sie zweimal definiert ist:

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

Und:

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

Um diese Art von Problemen zu vermeiden, sollten Sie die virtuelle Vererbung verwenden, die weiß, dass sie auf die richtige Ambig() Funktion.

Also - definieren:

class C : public virtual Base

class D : public virtual Base

class Right : public C, public D

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X