Corso C++ Parte 5: l’ereditarietà

In questa quinta parte del corso di C++ andremo a parlare dell’ereditarietà delle classi e di come implementarla nel codice.

Nello scorso articolo abbiamo affrontato uno degli argomenti chiave del corso, ossia le classi. Abbiamo visto la struttura base della classe e di come implementare i metodi all’interno del codice principale del programma. Ora estendiamo il concetto di classe con quello di ereditarietà.

Che cos’è l’ereditarietà?

Per ereditarietà si intende l’estensione di una classe con funzioni e metodi appartenenti ad altre classi. Si crea quindi una sorta di gerarchia delle classi, dove abbiamo una classe madre e varie sottoclassi che estendono quella principale. Per estendere una classe si utilizza la punteggiatura “:” nella dichiarazione della classe. Vediamone un esempio pratico.

#include <iostream.h>

public class Persona{

variabile1;
variabile2;
funzione1;
funzione2;
}

public class Studente:public Persona{
variabile3;
variabile4;
funzione3;
funzione4;

}

Come potete vedere, abbiamo prima definito una classe Persona, che chiameremo classe base. Successivamente è stata scritta una nuova classe denominata Studente che estende la classe Persona con ulteriori variabili e metodi. La definizione stessa di ereditarietà permette alla classe Studente di ereditare appunto le variabili e i metodi della classe Persona, senza doverli dichiarare nuovamente. In questo caso si parla di classe derivata. Se non avessimo utilizzato il “:” e avremmo dichiarato la classe Studente separatamente, bisognava dichiarare anche gli stessi metodi della classe base, magari implementandoli diversamente. Il concetto di ereditarietà segue la regola del is-a. Quindi quando dobbiamo dichiarare una classe che ne estende un’altra bisogna considerare il fatto che a sinistra del “:” scriveremo il nome della classe derivata mentre a destra andrà il nome della classe base. Nel nostro esempio si leggera Studente is-a Persona.

L’utilizzo dell’ereditarietà è fondamentale nella programmazione ad oggetti poiché permette di realizzare diversi programmi partendo da una medesima classe base ed estendendola tramite diverse classi derivate, che possono essere sfruttate per scopi differenti. Ciò permette un risparmio sia di tempo nell’esecuzione del programma che di risorse.

[adsense]

Ereditarietà multipla

L’ereditarietà consiste, come già detto, in una gerarchia di classi. Ciò quindi non impedisce di dichiarare classi che si estendono a catena, creando quella che viene definita ereditarietà multipla. Il concetto di base è lo stesso, con una piccola modifica.

class Flora {

variabile1;
variabile2;
funzione1;

}

class Pianta {

variabile3;
funzione2;

}

class Cactus: public Pianta, public Flora {

variabile4;
funzione3;

}

In questo esempio molto semplice viene rappresentato chiaramente il concetto di ereditarietà multipla. Per prima cosa abbiamo definito due classi base, Flora e Pianta, e successivamente la classe Cactus, che eredita tutte le proprietà delle due classi precedenti. Quindi la classe Cactus potrà utilizzare i metodi e le variabili sia della classe Flora che della classe Pianta. Consideriamo invece quest’altro esempio leggermente diverso.

class Flora {

variabile1;
variabile2;
funzione1;

}

class Pianta: public Flora {

variabile3;
funzione2;

}

class Cactus: public Pianta, public Flora {

variabile4;
funzione3;

}

In questo caso abbiamo inserito una doppia ereditarietà. La prima riguarda la classe Pianta, che eredità solamente la classe Flora, mentre la seconda è l’ereditarietà multipla già vista prima. La modifica riguarda il fatto che mentre prima la classe Pianta non poteva utilizzare metodi e variabili della classe Flora, ora può farlo. Quindi adesso abbiamo una singola classe base Flora e le altre due si estendono a catena.

Si conclude qui questo articolo sull’ereditarietà delle classi. Abbiamo cercato di spiegarvi il concetto nella maniera più semplice possibile ma senza trascurare nulla.