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