Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Virtual- en Override-trefwoorden | Overzicht van Polymorfisme
C++ OOP
course content

Cursusinhoud

C++ OOP

C++ OOP

1. Fundamenten van OOP in C++
2. Constructors en Destructors
3. Overzicht van Encapsulatie
4. Overzicht van Overerving
5. Overzicht van Polymorfisme

book
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

Base.h

copy
1234567
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

main.cpp

copy
123456789101112131415161718192021222324252627
#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(); }
Note
Opmerking

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

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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); }
Note
Opmerking

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

main.cpp

copy
1234567891011121314
#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.

question mark

Wat is het belangrijkste doel van het sleutelwoord virtual?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 2

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

course content

Cursusinhoud

C++ OOP

C++ OOP

1. Fundamenten van OOP in C++
2. Constructors en Destructors
3. Overzicht van Encapsulatie
4. Overzicht van Overerving
5. Overzicht van Polymorfisme

book
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

Base.h

copy
1234567
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

main.cpp

copy
123456789101112131415161718192021222324252627
#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(); }
Note
Opmerking

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

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#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); }
Note
Opmerking

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

main.cpp

copy
1234567891011121314
#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.

question mark

Wat is het belangrijkste doel van het sleutelwoord virtual?

Select the correct answer

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 5. Hoofdstuk 2
some-alt