Vai al contenuto
eLearner.app
Modulo 6 · Lezione 2 di 214/18 nel corso~15 min
Lezioni del modulo (2/2)

Polimorfismo e funzioni virtuali

Il Polimorfismo consente di trattare oggetti di classi derivate diverse tramite un puntatore o riferimento alla loro classe base, garantendo l'esecuzione della versione corretta di ciascun metodo a runtime (Late Binding).

Funzioni Virtuali: virtual ed override

Per abilitare il polimorfismo su un metodo, dobbiamo dichiararlo con la parola chiave virtual all'interno della classe base. Nelle classi derivate, usiamo lo specificatore override per indicare esplicitamente che stiamo sovrascrivendo tale metodo.

Code
class Employee {
public:
    virtual void work() {
        std::cout << "Lavoro generico" << std::endl;
    }
    // IMPORTANTE: Distruttore virtuale nella classe base per evitare memory leak
    virtual ~Employee() = default;
};

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

Utilizzando puntatori alla classe base, C++ risolverà il metodo corretto a runtime:

Code
Employee* emp = new Developer();
emp->work(); // Stampa "Scrittura codice in C++" invece di "Lavoro generico"
delete emp;

Classi Astratte e Funzioni Virtuali Pure

Una funzione virtuale pura è una funzione membro virtuale dichiarata con = 0 alla fine. Essa rappresenta un contratto formale: la classe base non fornisce alcuna implementazione, delegandola interamente alle sottoclassi.

Una classe che contiene almeno una funzione virtuale pura è detta Classe Astratta e non può essere istanziata direttamente.

Code
class Instrument {
public:
    virtual void play() = 0; // Virtuale pura
    virtual ~Instrument() = default;
};

class Piano : public Instrument {
public:
    void play() override {
        std::cout << "Suono del pianoforte..." << std::endl;
    }
};

Prova tu

Esercizio#cpp.m6.l2.e1
Tentativi: 0Caricamento…

Definisci un metodo virtuale makeSound() in Animal che stampa 'Some sound'. Successivamente sovrascrivilo nella classe Cat usando lo specificatore override per stampare 'Meow'.

Caricamento editor…
Mostra suggerimento

Ricorda di anteporre `virtual` al metodo della classe base e posizionare `override` dopo la tonda dei parametri nella classe derivata.

Soluzione disponibile dopo 3 tentativi

Esercizio#cpp.m6.l2.e2
Tentativi: 0Caricamento…

Dichiara una funzione virtuale pura print() ritornando void all'interno della classe astratta Printable. Crea poi la classe Document che eredita public-mente da Printable e implementa il metodo print() per stampare 'Printing Document'.

Caricamento editor…
Mostra suggerimento

Una funzione virtuale pura si dichiara con la firma `virtual void print() = 0;`. Assicurati che `Document` erediti public-mente da `Printable`.

Soluzione disponibile dopo 3 tentativi