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;
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;
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
'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. –
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
Haben a [dieses lesen] (http://stackoverflow.com/questions/21558/in-c-virtual-base-class#21607) (es gefragt ist schon Vor). –