Utilizzando l'ereditarietà, è possibile creare una classe generale (classe base) che definisce le caratteristiche comuni a una serie di oggetti correlati. Questa classe può in seguito essere ereditata da una o più classi (classi derivate), ognuna delle quali aggiunge alla classe ereditata solo elementi specifici, senza modificare la classe base. La classe originaria viene denominata classe base mentre la classe che "riceve" l'eredità è detta classe derivata (o sottoclasse o figlia). A sua volta, una classe derivata può fungere da classe base per un'altra classe derivata. In questo modo è possibile derivare più classi da una singola classe base, riproducendo a più livelli il meccanismo di ereditarietà.
La classe base può essere una qualsiasi classe C++ e tutte le classi derivate ne rifletteranno la descrizione, aggiungendo nuove funzionalità a quest'ultima (aggiungendo, ad esempio, nuove funzioni membro o modificando tramite overloading le funzioni membro esistenti). Quando una classe ne eredita un'altra, i membri della classe base divengono membri della classe derivata.
L'ereditarietà delle classi si specifica nella definizione della classe derivata, inserendo, dopo il nome della classe e prima della parentesi graffa di apertura, il simbolo ":" seguito dal nome della classe base:
class nome-classe-derivata : specificatore d'accesso classe base
{
//corpo della classe
};
Ad esempio:
class colore_giallo : public colori
{
//corpo della classe
};
In tal caso, la classe derivata si chiama colore_giallo. La classe base ha visibilità pubblica e si chiama colore.
Il tipo di accesso che la classe derivata può avere sui membri della classe base è determinato dallo specificatore d'accesso. Lo specificatore d'accesso della classe base può essere public, private o protected.
NOTA: I singoli attributi e funzioni membro della classe possono essere dichiarati come:
- private: accessibili solo alle funzioni membro appartenenti alla stessa classe
- protected: accessibili alle funzioni membro appartenenti alla stessa classe e alle classi da questa derivate.
- public: accessibili da ogni parte del programma entro il campo di validità della classe in oggetto.
Il meccanismo di ereditarietà, pur essendo abbastanza semplice, richiede una certa attenzione per non cadere in errori perchè dipende dallo standard della classe base. In pratica, gli attibuti ed i membri che vengono ereditati dalla classe base possono cambiare la loro visibilità nella classe figlia, in base allo specificatore d'accesso con il quale si esegue l'ereditarietà stessa. Precisamente:
- Se lo specificatore d'accesso è public:
- i public restano public
- i protected restano protected
- i private non possono essere trasferiti
- Se lo specificatore d'accesso è private:
- i public diventano private
- i protected diventano private
- i private non possono essere trasferiti
Per cui che durante l'ereditarietà un accesso può restringersi o restare uguale ma mai ampliarsi.
Per concludere diremo che:
- L'ereditarietà è una tecnica che permette di descrivere una nuova classe, nei termini di un'altra già esistente e di compiere quelle modifiche o estensioni necessarie per soddisfare i nuovi bisogni.
- La sottoclasse eredita tutti i metodi (operazioni) della genitrice, ma può essere estesa con metodi ed attributi locali che ne completano la descrizione. Questa rappresenta una forma di specializzazione.
- L'ereditarietà offre vantaggi in termini di riuso ed astrazione.