Passer au contenu principal
eLearner.app
Module 6 · Leçon 2 sur 214/18 dans le cours~15 min
Leçons du module (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

Exercice#cpp.m6.l2.e1
Tentatives : 0Chargement…

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

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives

Exercice#cpp.m6.l2.e2
Tentatives : 0Chargement…

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'.

Chargement de l'éditeur…
Afficher l'indice

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

Solution disponible après 3 tentatives