Virtuelle Vererbung in C
Beim Umgang mit Mehrfachvererbung in C ist das Verständnis der virtuellen Vererbung von entscheidender Bedeutung. Betrachten Sie den folgenden Codeausschnitt:
class Base { public: Base(Base* pParent); /* implements basic stuff */ }; class A : virtual public Base { public: A(A* pParent) : Base(pParent) {} /* ... */ }; class B : virtual public Base { public: B(B* pParent) : Base(pParent) {} /* ... */ }; class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here /* ... */ };
In diesem Beispiel erbt C sowohl von A als auch von B, die wiederum virtuell von Base erben. GCC löst an der markierten Zeile einen Kompilierungsfehler aus, da es nicht bestimmen kann, welcher Konstruktor für die Basisklasse aufgerufen werden soll.
Erklärung:
Virtuelle Basisklassen verfügen über einen einzigartigen Initialisierungsmechanismus . Im Gegensatz zu nicht virtuellen Basisklassen werden virtuelle Basisklassen nicht durch Zwischenbasisklassen, sondern durch die am stärksten abgeleitete Klasse initialisiert. Dies liegt daran, dass in einer Diamant-Vererbungshierarchie jede Basisklasse nur einmal definiert ist und nur einmal von der am stärksten abgeleiteten Klasse initialisiert werden sollte.
In unserem Beispiel ist C die am stärksten abgeleitete Klasse. Allerdings wird die Base-Klasse in ihrem Konstruktor nicht explizit initialisiert. Daher versucht GCC, den Standardkonstruktor von Base zu verwenden. Da C jedoch nicht direkt von Base erbt, ist der Standardkonstruktor nicht zugänglich, was zum Kompilierungsfehler führt.
Lösung:
Um dieses Problem zu beheben, muss der Der Konstruktor von C muss die Basisklasse explizit mit einem virtuellen Basisinitialisierer initialisieren:
class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent), Base(pParent) {} /* ... */ };
Durch Einbindung des Base(pParent)-Aufrufs in den Konstruktor von C geben wir explizit den zu verwendenden Base-Konstruktor an und stellen so sicher, dass Base ordnungsgemäß initialisiert wird.
Das obige ist der detaillierte Inhalt vonWie löst die virtuelle Vererbung Probleme bei der Initialisierung von Mehrfachvererbungskonstruktoren in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!