Perchè costruttori protected
Le classi astratte rappresentano categorie di oggetti che non possono essere istanziati. In C++ sono rappresentate da classi che hanno almeno una member function virtuale pura...
Author: Mario Graziosi, mgnospam@fgasoftware.com
Le classi astratte rappresentano categorie di oggetti che non possono essere istanziati. In C++ sono rappresentate da classi che hanno almeno una member function virtuale pura. Per esempio:
class Conto {
public:
Conto();
Conto(const string& id);
virtual ~Conto() {}
virtual double Saldo() const = 0; // Virtuale pura
};
Nella classe sopra la funzione Saldo() rende la classe astratta. Cosa c'è di sbagliato? Dal punto di vista della sintassi non ci sono errori, ma resta il fatto che solo le classi derivate possono istanziare un Conto. Così, se scriviamo qualcosa come: Conto* p = new Conto;il compilatore ci segnalerà un errore perchè stiamo cercando di istanziare una classe astratta. E quindi, l'effettivo problema della classe Conto è che abbiamo inutilmente inquinato la sezione public illudento i "clienti" della classe di poter istanziare un Conto con uno dei suoi costruttori. Un modo migliore per descrivere l'interfaccia di Conto sarebbe stato:
class Conto {
public:
virtual ~Conto() {}
virtual double Saldo() const = 0; // Virtuale pura
protected:
Conto();
Conto(const string& id);
};
In questo modo risulta evidente, a chiunque osservi l'interfaccia di Conto, che si tratta di una classe astratta, proprio perchè i costruttori sono stati dichiarati nella sezione protected.