Heim >Backend-Entwicklung >C++ >Warum wird der Standardkonstruktor der Großmutterklasse bei der virtuellen Vererbung aufgerufen?

Warum wird der Standardkonstruktor der Großmutterklasse bei der virtuellen Vererbung aufgerufen?

DDD
DDDOriginal
2024-11-16 22:22:03906Durchsuche

Why is the Grandmother Class's Default Constructor Called in Virtual Inheritance?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn