Warum wird der Standardkonstruktor bei der virtuellen Vererbung aufgerufen?
Beim Erstellen eines neuen Objekts einer Tochterklasse mithilfe der virtuellen Vererbung wird der Standardkonstruktor von Die Großmutterklasse wird unerwartet aufgerufen. Dieses Verhalten mag kontraintuitiv erscheinen, wenn man bedenkt, dass der Benutzer den Konstruktor der Mutterklasse explizit mit einem Argument aufruft.
Erklärung:
Bei der virtuellen Vererbung der Konstruktor der virtuellen Basis Die Klasse wird direkt vom Konstruktor der am meisten abgeleiteten Klasse aufgerufen. Im angegebenen Code ist die Tochterklasse die am stärksten abgeleitete Klasse und ruft daher direkt den Großmutterkonstruktor auf.
Da die Tochterklasse dem Großmutterkonstruktor in der Initialisierungsliste keine Argumente bereitstellt, ist dies die Standardeinstellung Der Konstruktor der Großmutterklasse wird automatisch aufgerufen. Dies liegt daran, dass der Compiler standardmäßig davon ausgeht, dass der Standardkonstruktor verwendet werden sollte, wenn kein bestimmter Konstruktor aufgerufen wird.
Lösung:
So rufen Sie den gewünschten Großmutterkonstruktor auf Mit einem Argument muss die Initialisierungsliste des Tochterklassenkonstruktors explizit aktualisiert werden. Der korrekte Code lautet:
daughter(int attr) : grandmother(attr), mother(attr) { ... }
Dadurch wird sichergestellt, dass der Grandma-Konstruktor mit dem angegebenen Argument aufgerufen wird. Alternativ kann die Grandma-Klasse einen Standardkonstruktor bereitstellen, der ein Argument akzeptiert.
Das obige ist der detaillierte Inhalt vonWarum wird der Standardkonstruktor der Großmutterklasse bei der virtuellen Vererbung aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!