Heim >Backend-Entwicklung >C++ >Warum verursacht die virtuelle Vererbung Fehler bei der Konstruktorinitialisierung in C?
Virtuelle Vererbung und Konstruktorinitialisierung
Virtuelle Vererbung ist eine Technik, die in C verwendet wird, um die Mehrdeutigkeit der Mehrfachvererbung aufzulösen. Wenn eine Klasse von mehreren Basisklassen erbt, die dasselbe Mitglied haben, stellt die virtuelle Vererbung sicher, dass nur eine einzige Kopie dieses Mitglieds erstellt wird, wodurch der Speicheraufwand reduziert wird.
Die virtuelle Vererbung bringt jedoch eine einzigartige Situation mit sich, wenn sie auftritt zur Konstruktorinitialisierung. Im bereitgestellten Beispiel haben wir drei Klassen: Base, A und B, wobei sowohl A als auch B praktisch von Base erben. Klasse C erbt dann sowohl von A als auch von B.
Das Problem
Im Konstruktor der Klasse C tritt während der Initialisierung von Base ein Fehler auf. Der Compiler kann den Funktionsaufruf nicht an Base() anpassen, da C nicht direkt von Base erbt. Warum tritt dieser Fehler auf?
Grundlegendes zur Initialisierung virtueller Basisklassen
Virtuelle Basisklassen haben einen anderen Initialisierungsprozess als nicht virtuelle Basisklassen. Wenn eine virtuelle Basisklasse geerbt wird, liegt es in der Verantwortung der am stärksten abgeleiteten Klasse, sie zu initialisieren. In diesem Fall ist Klasse C die am stärksten abgeleitete Klasse und muss die virtuelle Basisklasse Base initialisieren.
Da Base keine direkte Instanz von C hat, kann sie nicht mit den Konstruktoren A oder B initialisiert werden. Stattdessen muss Base mit seinem Standardkonstruktor initialisiert werden. Der bereitgestellte Code enthält jedoch nicht den Standardkonstruktor für Base.
Die Lösung
Um dieses Problem zu beheben, müssen Sie einen Standardkonstruktor in der Base-Klasse definieren , etwa so:
class Base { public: Base() = default; // Default constructor added Base(Base* pParent); /* implements basic stuff */ };
Dieser Standardkonstruktor wird verwendet, um die virtuelle Basisvariable in Klasse C zu initialisieren.
Das obige ist der detaillierte Inhalt vonWarum verursacht die virtuelle Vererbung Fehler bei der Konstruktorinitialisierung in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!