Virtuele functies bestaan al sinds het begin van C++ als een middel voor dynamisch polymorfisme. Echter, eerder was er geen syntactisch mechanisme dat de compiler dwong om de correctheid van het overschrijven van virtuele functies in afgeleide klassen te controleren. Na de introductie van C++11 werd het sleutelwoord override een hulpmiddel voor aanvullende compilercontroles.
Zonder override garandeert de compiler niet dat de functie daadwerkelijk de methode van de basis klasse overschrijft. Fouten in de handtekening (bijvoorbeeld een onjuist type of const) leiden tot de creatie van een nieuwe functie in de afgeleide klasse (“schaduwing”), wat polymorfisme verstoort en debuggen moeilijk maakt.
Het gebruik van override bij het declareren van een virtuele functie in een afgeleide klasse stelt de compiler in staat te controleren of de handtekening exact overeenkomt met de virtuele functie van de ouderklasse, en of de functie daadwerkelijk de ouderklasse overschrijft. Anders wordt de compilatie onderbroken met een foutmelding.
Codevoorbeeld:
struct Base { virtual void foo() const {} }; struct Derived : Base { void foo() const override { /* implementatie */ } };
Als je in Derived void foo() zonder const override schrijft, zal de compiler een foutmelding geven.
Belangrijke kenmerken:
Is het mogelijk om een virtuele functie met het sleutelwoord 'override' achter te laten, maar zonder het sleutelwoord 'virtual'?
Ja, override impliceert dat de functie virtueel is. Het is overbodig om virtual samen met override aan te geven, maar het is niet verboden.
Kan er een fout optreden als de functie alleen verschilt door de const-modificator of ref qualifier (bijvoorbeeld, & of &&)?
Ja, elke afwijking in de handtekening, inclusief die van const/referenties, verstoort de overschrijving. Bijvoorbeeld, void foo() override overschrijft niet void foo() const, en de compiler zal dit dankzij override opsporen.
Kan 'override' gebruikt worden voor statische functies of constructeurs?
Nee. override is alleen voor virtuele functies, kan niet toegepast worden op statische functies, constructeurs, destructeurs (tenzij ze virtueel zijn).
In een groot project heeft de afgeleide klasse een typfout in de handtekening van de functie: de functie overschrijft feitelijk niet, maar de ontwikkelaar denkt van wel, polymorfisme werkt niet zoals verwacht.
Voordelen:
Nadelen:
In alle afgeleide klassen wordt override gebruikt, tests vangen fouten al tijdens de buildfase.
Voordelen:
Nadelen: