0Pricing
C++ Academy · Lezione

Classi astratte e metodi virtuali puri

Definisca interfacce con metodi virtuali puri e imponga i contratti delle classi derivate

Classi astratte e metodi virtuali puri è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 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.

Che cos'è una classe astratta?

Una classe astratta dispone di almeno una funzione virtuale pura, dichiarata con = 0. Non è possibile istanziarla direttamente.

class Animal {
public:
    virtual void speak() const = 0;   // pure virtual
    virtual ~Animal() = default;
};

// Animal a;     // ERROR: cannot instantiate

Funzioni virtuali pure

= 0 indica che una funzione non ha un'implementazione predefinita. Le classi derivate devono sovrascriverla prima che la classe possa essere istanziata.

Implementare l'interfaccia

Le classi derivate forniscono corpi concreti per ogni funzione virtuale pura.

class Dog : public Animal {
public:
    void speak() const override {
        std::cout << "Woof!\n";
    }
};

Dog d;
d.speak();      // Woof!

Le classi astratte come interfacce

Una classe astratta con soli metodi virtuali puri e senza membri dati funziona come un'interfaccia negli altri linguaggi.

class Drawable {
public:
    virtual void draw() const = 0;
    virtual ~Drawable() = default;
};

Combinare implementazione e interfaccia

Le classi astratte possono contenere sia metodi virtuali puri sia metodi concreti. Le funzioni virtuali pure definiscono il contratto; i metodi concreti forniscono un comportamento condiviso.

class Logger {
public:
    void logInfo(const std::string& msg) { log("INFO", msg); }
    void logError(const std::string& msg) { log("ERROR", msg); }
protected:
    virtual void log(const std::string& level, const std::string& msg) = 0;
};

Virtuale pura con corpo predefinito

Una funzione virtuale pura può avere un corpo, utile come comportamento predefinito che le classi derivate possono chiamare.

class Base {
public:
    virtual void f() = 0;
};
void Base::f() {
    std::cout << "default behavior\n";
}

class Derived : public Base {
public:
    void f() override {
        Base::f();          // call the default
        std::cout << "extra\n";
    }
};

Utilizzare puntatori e riferimenti

Il codice polimorfico conserva gli oggetti astratti tramite puntatori o riferimenti al tipo base.

void perform(const Animal& a) {
    a.speak();
}

Conservare gli oggetti nei contenitori

I vector non possono contenere tipi astratti per valore. Utilizzi i puntatori, in genere smart pointer.

std::vector<std::unique_ptr<Animal>> zoo;
zoo.push_back(std::make_unique<Dog>());
zoo.push_back(std::make_unique<Cat>());
for (auto& a : zoo) a->speak();

Quando utilizzare le classi astratte

Le utilizzi quando:

  • vuole definire un'interfaccia comune per più implementazioni non correlate
  • ha bisogno di un tipo base per contenitori polimorfici
  • vuole inserire un comportamento tramite sottoclassi (pattern Template Method)

Alternative: concept e template

Per il polimorfismo a compile time, i concept di C++20 e i template spesso sostituiscono le classi astratte, senza costi a runtime. Utilizzi virtual quando il polimorfismo è necessario a runtime.

Problema: slicing

Passi le classi astratte per riferimento o tramite puntatore. Il passaggio per valore è comunque impossibile, perché non è possibile istanziare un tipo astratto; tuttavia, passare per valore una classe derivata causerebbe slicing.

Verifica rapida

Che cosa rende astratta una classe in C++?

Riepilogo

Le classi astratte, cioè quelle con almeno un metodo virtuale puro, definiscono interfacce per il codice polimorfico. Le utilizzi con puntatori o riferimenti, spesso smart pointer, per inoltrare il comportamento a runtime.

Domande Frequenti

La lezione «Classi astratte e metodi virtuali puri» è gratuita?

Sì — il testo completo di «Classi astratte e metodi virtuali puri» è 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 «Classi astratte e metodi virtuali puri»?

Definisca interfacce con metodi virtuali puri e imponga i contratti delle classi derivate 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 3 di 4.

Quanto tempo richiede la lezione «Classi astratte e metodi virtuali puri»?

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