Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi



Scaricare 445 b.
22.12.2017
Dimensione del file445 b.


Ereditarietà

  • Una classe può essere derivata da una classe esistente usando la sintassi:

  • public, protected e private specificano il tipo di accesso ai membri della classe

  • protected vuol dire che i campi sono accessibili da una sottoclasse, ma non da altre classi esterne (sta fra public e private, è come se la sottoclasse fosse friend della classe di base per quei campi)


Ereditarietà (2)

  • Una classe derivata pubblicamente è a tutti gli effetti un sottotipo della classe base.

    • Un oggetto della classe derivata può essere trattato come se fosse un oggetto della classe base
    • Un puntatore alla classe base può puntare ad oggetti della classe derivata
    • Un riferimento alla classe derivata può, se la cosa ha un senso, essere implicitamente convertito ad un riferimento alla classe base
    • E` possibile dichiarare un riferimento alla classe base ed inizializzarlo ad un oggetto della classe derivata


Ereditarietà (3)

  • La definizione dell’interfaccia (metodi pubblici) della classe base è estremamente importante perchè determina il comportamento delle classi derivate

  • Un metodo della classe base può essere:

    • dichiarato e definito normalmente
    • dichiarato virtual e definito normalmente
      • la classe derivata eredita questo metodo e può ridefinirlo
    • dichiarato virtual e non definito (=0)


Classi base astratte

  • Una funzione puramente virtuale è un metodo virtuale non definito. E` dichiarato come:

  • Una classe che ha almeno un metodo puramente virtuale è chiamata classe astratta

  • Oggetti di una classe astratta non possono esistere

  • Puntatori ad una classe base astratta possono essere definiti ed usati polimorficamente (per puntare ad oggetti delle classi derivate)

  • Una classe base astratta viene introdotta per specificare l’interfaccia di una categoria di classi



Esempio: i soldati

  • Tutti i soldati devono capire il messaggio attacca. Il messaggio ha conseguenze diverse a seconda del tipo di soldato:

  • Il gestore della schermata vuole tenere una lista di soldati e vuole poter dire ad ogni soldato di attaccare indipendentemente dal tipo ma basandosi solo sulla posizione.



list lista;

  • list lista;

  • riempiLista(lista);

  • Posizione unaPosizione=...;

  • list::iterator iter;

  • for(iter=lista.begin();iter!=lista.end();iter++){

  • Soldato unSoldato=(*iter);

  • if(unSoldato.posizione()==unaPosizione) unSoldato.attacca();

  • }

  • class Soldato {

  • void attacca() {

  • // cosa scrivo qui?!? Per quale tipo di

  • // soldato implemento il metodo attacca()?

  • // soluzione la dichiaro virual = 0!!!!

  • }

  • };



class Soldato {

  • class Soldato {

  • virtual void attacca()=0;

  • };

  • class Arcere : public Soldato {

  • virtual void attacca() {

  • // lancia una freccia

  • }

  • };

  • class Fante : public Soldato {

  • virtual void attacca() {

  • // usa la spada

  • }

  • };

  • ...



Erediarietà multipla

  • L’ereditarietà multipla permette di derivare una classe da due o più classi base. La sintassi viene estesa per permettere una lista di classi base

  • L’ ereditarietà multipla viene spesso utilizzata per combinare un’interfaccia ed una implementazione, ma è molte volte sintomo di un cattivo disegno



Ereditarietà (4)



Esempio: shape



Cerchi e quadrati



Cerchio



Cerchio (2)



Quadrato



Codice Applicativo (Client)



Polimorfismo



Interfaccia astratta



Ereditarietà e riuso del codice



Attenzione alle generalizzazioni...

  • Attenzione: scegliere le relazioni di ereditarietà può essere non banale.

  • Un quadrato è un rettangolo?



Ereditarietà multipla

  • Una classe può ereditare da più classi



Polimorfismo

  • Polimorfismo con tipi controllati dal compilatore

  • Come?

  • In C++ viene implementato tramite il concetto di ereditarietà (inheritance)

  • Classe astratta: definisce i metodi

  • Classe concreta: implementa i metodi

  • La classe concreta eredita da quella astratta







©astratto.info 2017
invia messaggio

    Pagina principale