Muster um Mehrere virtuelle Funktionen aufrufen
Verfasst: 16.01.2026, 13:02
Moin,
wenn ich in C++ eine Klassenhierarchie mit virtuellen Funktionen habe, wird ja immer die "unterste" Funktion aufgerufen. Die Spezialisierung überschreibt das Verhalten das Basisklasse. Nun gut. Aber sagen wir mal, die virtuelle Funktion sei eine Art Ereignis, und auch eine Klasse irgendwo in der Mitte der Hierarchie soll darauf reagieren und Code ausführen - wie mache ich das am elegantesten? Ich hätte gerne ein Verhalten wie bei Konstruktoren, wo alle in definierter Reihenfolge aufgerufen werden.
Mein Beispiel gerade: Widget Klassen und Sichtbarkeit. Sagen wir, ich habe ein Widget, davon abgeleitet eines, das einen Rahmen anzeigt (Sprite wird gerendert) und am Ende ein Text-Widget, das den Text hinzufügt. Ändert sich die Sichtbarkeit, müssen sowohl das Sprite als auch der Text umgeschaltet werden. Standardmäßig würde jetzt aber nur der Text umgeschaltet, weil nur die unterste Funktion ausgeführt wird.
Verschiedene mögliche Ansätze:
- Das Text-Widget ruft die virtuelle Funktion der Basisklasse auf. Funktioniert, ist aber nicht robust, weil eine andere, neue Klasse diesen Aufrufe vergessen könnte. Das möchte ich gerne vermeiden.
- Das Rahmen-Sprite deklariert die Überladung als final und hat eine neue virtuelle Funktion (update_visibility_internal), die sie dann aufruft. Funktioniert, ist robust, aber jetzt heißen meine Funktionen plötzlich anders. Noch lustiger wird es, wenn das über mehrere Ebenen mehrmals nacheinander passiert (update_internal_internal()).
- Ein komplettes Event-System, in dem sich Klassen registrieren können. Funktioniert und ist sehr flexibel, aber auch irgendwie sehr viel zusätzlicher Code. Außerdem haben virtuelle Funktionen den Vorteil, das man nicht vergessen kann sie zu implementieren.
Ich tendiere gerade am ehesten zur zweiten Variante, aber besonders happy bin ich damit noch nicht. Gibt es noch irgendwelche anderen Ideen?
wenn ich in C++ eine Klassenhierarchie mit virtuellen Funktionen habe, wird ja immer die "unterste" Funktion aufgerufen. Die Spezialisierung überschreibt das Verhalten das Basisklasse. Nun gut. Aber sagen wir mal, die virtuelle Funktion sei eine Art Ereignis, und auch eine Klasse irgendwo in der Mitte der Hierarchie soll darauf reagieren und Code ausführen - wie mache ich das am elegantesten? Ich hätte gerne ein Verhalten wie bei Konstruktoren, wo alle in definierter Reihenfolge aufgerufen werden.
Mein Beispiel gerade: Widget Klassen und Sichtbarkeit. Sagen wir, ich habe ein Widget, davon abgeleitet eines, das einen Rahmen anzeigt (Sprite wird gerendert) und am Ende ein Text-Widget, das den Text hinzufügt. Ändert sich die Sichtbarkeit, müssen sowohl das Sprite als auch der Text umgeschaltet werden. Standardmäßig würde jetzt aber nur der Text umgeschaltet, weil nur die unterste Funktion ausgeführt wird.
Verschiedene mögliche Ansätze:
- Das Text-Widget ruft die virtuelle Funktion der Basisklasse auf. Funktioniert, ist aber nicht robust, weil eine andere, neue Klasse diesen Aufrufe vergessen könnte. Das möchte ich gerne vermeiden.
- Das Rahmen-Sprite deklariert die Überladung als final und hat eine neue virtuelle Funktion (update_visibility_internal), die sie dann aufruft. Funktioniert, ist robust, aber jetzt heißen meine Funktionen plötzlich anders. Noch lustiger wird es, wenn das über mehrere Ebenen mehrmals nacheinander passiert (update_internal_internal()).
- Ein komplettes Event-System, in dem sich Klassen registrieren können. Funktioniert und ist sehr flexibel, aber auch irgendwie sehr viel zusätzlicher Code. Außerdem haben virtuelle Funktionen den Vorteil, das man nicht vergessen kann sie zu implementieren.
Ich tendiere gerade am ehesten zur zweiten Variante, aber besonders happy bin ich damit noch nicht. Gibt es noch irgendwelche anderen Ideen?