0Pricing
C++ Academy · Lezione

Funzioni virtuali e vtable

Implementi il polimorfismo a runtime con funzioni virtuali ed esamini il concetto di vtable

Funzioni virtuali e vtable è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Binding statico e dinamico

Per impostazione predefinita, le chiamate ai membri utilizzano il binding statico: il compilatore sceglie la funzione in base al tipo dichiarato. Con le funzioni virtual, la chiamata utilizza il binding dinamico in base al tipo effettivo.

Dichiarare una funzione virtuale

Contrassegni la funzione con virtual nella classe base. Le classi derivate possono sovrascriverla.

class Shape {
public:
    virtual double area() const = 0;        // pure virtual
    virtual ~Shape() = default;
};

class Circle : public Shape {
    double r_;
public:
    Circle(double r) : r_(r) {}
    double area() const override { return 3.14159 * r_ * r_; }
};

Lo specificatore override

Aggiunga override ai metodi derivati. Il compilatore verifica che la funzione sovrascriva effettivamente una funzione virtuale, rilevando gli errori nella firma.

Lo specificatore final

final impedisce ulteriori sovrascritture. Lo utilizzi sulle classi da cui non si deve ereditare o sui metodi che non devono essere sovrascritti ulteriormente.

class Concrete final : public Base { /* ... */ };
class Base {
    virtual void f() final;   // cannot be overridden
};

Chiamare tramite un puntatore alla classe base

Il punto di forza del polimorfismo: un puntatore alla classe base può inoltrare la chiamata al metodo corretto della classe derivata.

Shape* s = new Circle(3.0);
std::cout << s->area();   // 28.27... (Circle::area)
delete s;

Il concetto di vtable

Ogni classe polimorfica dispone di una vtable nascosta, cioè una tabella di puntatori a funzioni. Ogni oggetto contiene un puntatore nascosto (vptr) alla vtable della propria classe.

Costo delle chiamate virtuali

Una chiamata virtuale aggiunge un'indirezione attraverso la vtable. Nella maggior parte del codice il costo è trascurabile. La eviti nei cicli interni se le misurazioni mostrano che è un collo di bottiglia.

Funzioni virtuali pure

Aggiunga = 0 per rendere una funzione virtuale pura. Le classi derivate devono sovrascriverla per poter essere istanziate. La classe diventa astratta.

Distruttori virtuali

Se una classe dispone di una funzione virtuale o è destinata a essere eliminata tramite un puntatore alla classe base, le assegni un distruttore virtuale. In caso contrario, il distruttore della classe derivata non viene mai eseguito.

class Base {
public:
    virtual ~Base() = default;   // safe to delete through Base*
};

Polimorfismo con smart pointer

Conservi gli oggetti polimorfici tramite smart pointer alla classe base. Lo smart pointer gestisce correttamente la distruzione.

std::unique_ptr<Shape> s = std::make_unique<Circle>(3.0);

Lo slicing, di nuovo

Passare un oggetto derivato per valore a una funzione che si aspetta la classe base elimina la parte derivata. Utilizzi riferimenti o puntatori per i parametri polimorfici.

Compromesso sulle prestazioni

Le funzioni virtuali aggiungono flessibilità a fronte di un piccolo costo a runtime. I template offrono polimorfismo a compile time senza costi a runtime: scelga in base alla necessità o meno del polimorfismo a runtime.

Verifica rapida

Perché una classe base polimorfica dovrebbe avere un distruttore virtual?

Riepilogo

Le funzioni virtuali abilitano il polimorfismo a runtime tramite una vtable per classe. Contrassegni le sovrascritture con override e impedisca ulteriori ereditarietà con final. Assegni sempre un distruttore virtuale alle classi base polimorfiche.

Domande Frequenti

La lezione «Funzioni virtuali e vtable» è gratuita?

Sì — il testo completo di «Funzioni virtuali e vtable» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Funzioni virtuali e vtable»?

Implementi il polimorfismo a runtime con funzioni virtuali ed esamini il concetto di vtable Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Funzioni virtuali e vtable»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Ereditarietà singola e multipla
  2. Funzioni virtuali e vtable
  3. Classi astratte e metodi virtuali puri
  4. Ereditarietà e composizione a confronto
← Torna a C++ Academy