Direct naar de hoofdinhoud
Module 6 · Les 2 van 214/18 in de cursus~15 min
Modulelessen (2/2)

Polymorfisme en virtuele functies

Polymorfisme stelt ons in staat objecten van verschillende afgeleide klassen te behandelen via een pointer of verwijzing naar hun basisklasse, waardoor de juiste versie van een methode wordt aangeroepen tijdens runtime (Late Binding).

Virtuele functies: virtual en override

Om polymorfisme op een methode mogelijk te maken, moeten we deze declareren met het sleutelwoord virtual in de basisklasse. In afgeleide klassen gebruiken we de override specificatie om expliciet aan te geven dat we die methode overschrijven.

C++
class Employee {
public:
    virtual void work() {
        std::cout << "Generic work" << std::endl;
    }
    // IMPORTANT: Virtual destructor in base class to avoid memory leaks
    virtual ~Employee() = default;
};

class Developer : public Employee {
public:
    void work() override {
        std::cout << "Writing C++ code" << std::endl;
    }
};

Met behulp van verwijzingen naar de basisklasse zal C++ de juiste methode tijdens runtime oplossen:

C++
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;

Abstracte klassen en pure virtuele functies

Een puur virtuele functie is een virtuele lidfunctie die aan het einde wordt gedeclareerd met = 0. Het vertegenwoordigt een formeel contract: de basisklasse biedt geen implementatie en delegeert deze volledig aan subklassen.

Een klasse die ten minste één puur virtuele functie bevat, wordt een Abstracte klasse genoemd en kan niet rechtstreeks worden geïnstantieerd.

C++
class Instrument {
public:
    virtual void play() = 0; // Pure virtual
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Playing piano..." << std::endl;
    }
};

Probeer het zelf

Oefening#cpp.m6.l2.e1
Pogingen: 0Laden…

Definieer een virtuele methode makeSound() in Animal die 'Sommige geluiden' afdrukt. Overschrijf het vervolgens in de Cat-klasse met behulp van de override-specificatie om 'Miauw' af te drukken.

Editor laden…
Toon hint

Vergeet niet om `virtual` vóór de basisklassemethode te zetten en `override` na de parameterhaakjes in de afgeleide klasse te plaatsen.

Oplossing beschikbaar na 3 pogingen

Oefening#cpp.m6.l2.e2
Pogingen: 0Laden…

Declareer een pure virtuele functie print() die void retourneert binnen de abstracte klasse Printable. Maak vervolgens de Document-klasse die publiekelijk overneemt van Printable en implementeert de print()-methode om 'Printing Document' af te drukken.

Editor laden…
Toon hint

Een puur virtuele functie wordt gedeclareerd met de handtekening `virtual void print() = 0;`. Zorg ervoor dat 'Document' publiekelijk wordt overgenomen van 'Afdrukbaar'.

Oplossing beschikbaar na 3 pogingen