Cursusinhoud
C++ OOP
C++ OOP
Virtual- en Override-trefwoorden
Virtual Keyword
Het sleutelwoord virtual
wordt gebruikt vóór een methodeverklaring in een class
om het eerder besproken probleem op te lossen. Het wordt toegepast voor methoden die gemeenschappelijk zijn voor alle subklassen, maar een aparte implementatie vereisen voor elke subklasse. In wezen lijkt het op elke andere methodeverklaring, behalve dat het begint met virtual
.
Base.h
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };
Wanneer een functie als virtual
wordt gedeclareerd in een superklasse, maakt dit het mogelijk om deze te overschrijven in een subklasse. Dit betekent dat de subklasse haar eigen implementatie kan bieden, die zal worden aangeroepen in plaats van de oorspronkelijke implementatie wanneer de functie wordt aangeroepen via een pointer of referentie naar de superklasse.
main.cpp
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Wanneer u een pointer naar een object heeft en de leden wilt benaderen via de pointer, gebruikt u de pijl-operator (->
).
Terugkomend op de oplossing voor het oorspronkelijke probleem met knoppen, stelt deze methode ons in staat om eenvoudig één enkele functie te maken die een ouder Button
-pointer als parameter accepteert. Hierdoor kunnen we deze functie aanroepen door een SubmitButton
, ResetButton
of CancelButton
door te geven, en zal deze zich gedragen zoals bedoeld.
main.cpp
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Probeer objecten van verschillende subklassen te maken en deze aan de functie door te geven.
Het Override-trefwoord
Het trefwoord override
wordt gebruikt in een subklasse om expliciet aan te geven dat een lidfunctie een virtuele functie uit een superklasse overschrijft. Dit helpt om fouten tijdens het compileren te detecteren als de functiedeclaratie in de subklasse niet overeenkomt met een virtuele functie in de superklasse.
main.cpp
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }
Als er een fout is, zoals een typefout in de functiedeclaratie of wanneer de superklasse de functie die je probeert te overschrijven niet bevat, zal de compiler een foutmelding genereren. Dit helpt om potentiële bugs al tijdens het compileren op te sporen. Deze functionaliteit is vooral nuttig in grote teams, waar het bijhouden van wijzigingen zoals het hernoemen van methoden een uitdaging kan zijn.
Bedankt voor je feedback!