next up previous contents index
Next: Conclusione sul polimorfismo Up: Cenni di polimorfismo Previous: La soluzione   Indice   Indice analitico

Classi astratte

Spesso nella OOP si sente la necessità di costruire una classe che funga da interfaccia per le classi che derivino da essa; si può facilmente immaginare che spesso il programmatore di tale classe particolare non vuole che essa venga istanziata. La soluzione a questo problema consiste nel creare una classe astratta, cioè una classe contenente almeno una funzione virtuale pura. La sintassi per una funzione di tale tipo è la seguente: si aggiunge = 0 alla dichiarazione di essa, naturalmente senza fornire il corpo della funzione12.1. Non appena una classe contiene almeno una funzione virtuale pura, essa è astratta:

// ex12_5_5.cpp
#include <iostream.h>

// classe astratta
class Corda {
public:
  virtual void suona() = 0;  // funzione virtuale pura
  void f() {
    cout << "Corda::f()\n"; }
  virtual void g() {
    cout << "Corda::g()\n"; }
};

class Chitarra : public Corda {
public:
  void suona() {
    cout << "Chitarra::suona()\n";
    f(); g(); }
};

class Acustica : public Chitarra {
public:
  void suona() {
    cout << "Acustica::suona()\n";
    f(); g(); }
  void f() {
    cout << "Acustica::f()\n"; }
  void g() {
    cout << "Acustica::g()\n"; }
};

void main() {
  // Corda* c  = new Corda;  // NO
  Corda* c1 = new Chitarra;
  Corda* c2 = new Acustica;
  c1->suona();
  c2->suona();
}

output:


Chitarra::suona()
Corda::f()
Corda::g()
Acustica::suona()
Acustica::f()
Acustica::g()

La classe Corda è astratta, per cui il compilatore ci impedisce di istanziare un oggetto di tale tipo, mentre è lecito effettuare degli upcast a essa. Vediamo le funzioni membro delle nostre classi:


next up previous contents index
Next: Conclusione sul polimorfismo Up: Cenni di polimorfismo Previous: La soluzione   Indice   Indice analitico
Claudio Cicconetti
2000-09-06