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;
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;
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 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.