2009-01-07 15 views
43

Was bedeutet "virtuelle" Vererbung?virtuelle Vererbung

sah ich den folgenden Code, und nicht verstehen, die Bedeutung des Schlüsselwort virtual im folgenden Zusammenhang:

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

Haben a [dieses lesen] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class#21607) (es gefragt ist schon Vor). –

Antwort

38

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

Blick auf das folgende Beispiel, in dem 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: 

    //... 

}; 

Jetzt wollen Sie eine neue Klasse erstellen, erbt beide aus C- und D-Klassen (die beide die Funktion Base :: Ambig() geerbt haben):

class Wrong : public C, public D 
{ 

public: 

... 

}; 

Während Sie die „falsche“ Klasse oben definieren, erstellt man eigentlich die DDD (Diamant-Ableitungsproblem), weil Sie nicht anrufen:

Wrong wrong; 
wrong.Ambig(); 

Dies ist eine mehrdeutige Funktion ist, weil es zweimal 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 auf die ri beziehen kennen ght Ambig() Funktion. So

- definieren:

class C : public virtual Base 

class D : public virtual Base 

class Right : public C, public D 
+10

'Wrong' könnte sehr gut' Correct' sein. Es hängt von der Situation ab. Normaler MI und virtueller MI haben beide ihren Platz, sogar in der Gegenwart von (nicht-schrecklichen) Diamantmustern, die entstehen. Denken Sie daran, dass es keine Größe gibt, die für alle passt. –

+3

Ich denke, du machst die Aufmerksamkeit auf die falsche Sache - mit deinen "Wrong" und "Right" -Klassen. Sie sind aus einem bestimmten Grund identisch - sie sind nicht das Problem. Während Sie die virtuelle Vererbung für die Eltern C und D korrekt haben, beschönigen Sie sie im Grunde - C und D waren diejenigen, die "falsch" waren und korrigiert werden müssen, nicht die Klasse, die von beiden abgeleitet ist. – Kevin

Verwandte Themen