Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una...
Transcript of Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una...
![Page 1: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/1.jpg)
Ereditarietà
Uno studente è anche una persona
La classe Studente include tutti gli attributi e le funzioni membro della classe Persona
Inoltre, include attributi e funzioni aggiuntive
string nomestring cognomeint eta
Persona
Persona()ottieniNome()ottieniCognome()ottieniEta()
string nomestring cognomeint etastring istitutoint matricola
Studente
Studente()ottieniNome()ottieniCognome()ottieniEta()ottieniIstituto()ottieniMatricola()
![Page 2: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/2.jpg)
class Persona {
string nome;
string cognome;
int eta;public:
Persona(string nom, string cog, int anno);
string ottieniNome();
string ottieniCognome();
int ottieniEta();
};
Ereditarietàclass Studente {
string nome;
string cognome;
int eta;string istituto;int matricola;
public:Studente(string nom, string cog, int anno,
string ist, int mat);
string ottieniNome();
string ottieniCognome();
int ottieniEta();
string ottieniIstituto();
int ottieniMatricola();
};
• Duplicazione del codice• Possibilità di errori• Difficile manutenzione del codice
![Page 3: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/3.jpg)
Ereditarietà
Meccanismo dell’ereditarietà
La classe Studente è una classe derivata dalla classe base Persona
Studente eredita gli attributi e le funzioni di Persona• Studente è una specializzazione di Persona • Persona è una generalizzazione di Studente
Persona
Studente
![Page 4: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/4.jpg)
class Persona {
public:string nome;
string cognome;
int eta;Persona(string nom, string cog, int anno);
string ottieniNome();
string ottieniCognome();
int ottieniEta();
};
Ereditarietàclass Studente : public Persona {
public:string istituto;int matricola;Studente(string nom, string cog, int anno,
string ist, int mat);
string ottieniIstituto();
int ottieniMatricola();
};
La classe Studente ha visibilità di tutti i campi dato e tutte le funzioni della classe Persona
![Page 5: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/5.jpg)
int main() {
Persona p("Mario","Rossi",30);
Studente s("Luigi","Bianchi",25,"ITIS Da Vinci", 2416);
cout << p.ottieniNome() << endl;
cout << s.ottieniNome() << endl; // OK
cout << p.ottieniIstituto() << endl; // ERRORE!
cout << s.ottieniIstituto() << endl;
return 0;}
Ereditarietà
ottieniIstituto() non è funzione membro della classe Persona
ottieniNome() è funzione membro della classe Persona, ma viene ereditata da Studente
![Page 6: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/6.jpg)
Ereditarietà
Persona
Studente Lavoratore Pensionato
![Page 7: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/7.jpg)
Costruttore della classe derivataPersona::Persona(string nom, string cog, int anno) {
nome = nom;cog = cognome;eta = 2019 – anno;
}
Studente::Studente(string nom, string cog, int anno, string ist, int mat) :Persona(nom, cog, anno)
{istituto = ist;matricola = mat;
}
Chiamata al costruttore della classe base
Quando si «costruisce» la classe derivata, dobbiamo «costruire» anche la classe baseSe la classe base non ha un costruttore di default, allora la classe derivata deve invocare esplicitamente uno dei costruttori della classe base, specificandone i parametri
![Page 8: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/8.jpg)
class Persona { public:
string nome;string cognome;int eta;Persona(string nom, string cog, int anno); string ottieniNome();string ottieniCognome();int ottieniEta();void stampaAnagrafica();
};
...
void Persona::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;
}
Overridingclass Studente : public Persona { public:
string istituto;int matricola;Studente(string nom, string cog, int anno,
string ist, int mat); string ottieniIstituto();int ottieniMatricola();void stampaAnagrafica();
};
...
void Studente::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;cout << istituto << endl;cout << matricola << endl;
}
![Page 9: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/9.jpg)
int main() {
Persona p("Mario","Rossi",30);
Studente s("Luigi","Bianchi",25,"ITIS Da Vinci", 2416);
p.stampaAnagrafica(); // invoca la funzione definita nella classe Persona
s.stampaAnagrafica(); // invoca la funzione definita nella classe Studente
return 0;}
Overriding
![Page 10: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/10.jpg)
class Persona { public:
string nome;string cognome;int eta;Persona(string nom, string cog, int anno); string ottieniNome();string ottieniCognome();int ottieniEta();void stampaAnagrafica();
};
...
void Persona::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;
}
Accesso ai membri della classe baseclass Studente : public Persona { public:
string istituto;int matricola;Studente(string nom, string cog, int anno,
string ist, int mat); string ottieniIstituto();int ottieniMatricola();void stampaAnagrafica();
};
...
void Studente::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;cout << istituto << endl;cout << matricola << endl;
}
La classe derivata può usare gli attributi della classe base perché sono dichiarati nella parte publicPerò così non si realizza il principio di occultamento dell’informazione
![Page 11: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/11.jpg)
class Persona { private:
string nome;string cognome;int eta;
public:Persona(string nom, string cog, int anno); string ottieniNome();string ottieniCognome();int ottieniEta();void stampaAnagrafica();
};
...
void Persona::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;
}
Accesso ai membri della classe baseclass Studente : public Persona { private:
string istituto;int matricola;Studente(string nom, string cog, int anno,
string ist, int mat); string ottieniIstituto();int ottieniMatricola();void stampaAnagrafica();
};
...
void Studente::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;cout << istituto << endl;cout << matricola << endl;
}
Così si realizza il principio di occultamento dell’informazionePerò la classe derivata non può accedere ai membri privati della classe base
![Page 12: Ereditarietà - unipi.it · Ereditarietà Meccanismo dell’ereditarietà La classe Studente è una classe derivata dalla classe base Persona Studente eredita gli attributi e le funzioni](https://reader033.fdocumenti.com/reader033/viewer/2022052923/5f0416cf7e708231d40c43f9/html5/thumbnails/12.jpg)
class Persona { protected:
string nome;string cognome;int eta;
public:Persona(string nom, string cog, int anno); string ottieniNome();string ottieniCognome();int ottieniEta();void stampaAnagrafica();
};
...
void Persona::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;
}
Accesso ai membri della classe baseclass Studente : public Persona { protected:
string istituto;int matricola;
public:Studente(string nom, string cog, int anno,
string ist, int mat); string ottieniIstituto();int ottieniMatricola();void stampaAnagrafica();
};...
void Studente::stampaAnagrafica() {cout << nome << ", " << cognome << endl;cout << eta;cout << istituto << endl;cout << matricola << endl;
}
La classe derivata può usare gli attributi della classe base perché sono dichiarati nella parte protectedFunzioni esterne non possono utilizzare membri dichiarati nella parte protectedSi realizza il principio di occultamento dell’informazione