Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Ereditarietà in C++

Slides:



Advertisements
Presentazioni simili
Funzioni In C++ le funzioni sono caratterizzate da un nome, dal tipo della variabile ritornata e da una lista di parametri (opzionali) La lista dei parametri.
Advertisements

Funzioni Friend Come abbiamo visto non possiamo accedere a membri privati di una classe dall'esterno della classe. Ma a volte abbiamo bisogno di farlo.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unit à B2 Gli oggetti: concetti avanzati.
Oggetti Java.
Recupero debito quarto anno Secondo incontro
Informatica Recupero debito quarto anno Terzo incontro.
Divini università Realizzazione di un sistema di monitoraggio della qualità delle acque superficiali Progetto realizzato in collaborazione con i.
Capitolo 8 Array Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies srl.
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
TRATTAZIONE ALGEBRICA
ALLA SCOPERTA DEL TEOREMA DI PITAGORA
Algebra Booleana.
Introduzione al linguaggio C++ 5 lezioni
(pane quotidiano dell’algebra, dannazione… degli studenti)
Riassunto della prima lezione
La quantità di moto Data una particella di massa m che si muove con velocità v Si definisce quantità di moto la quantità: È un vettore Prodotto di uno.
Derivazione tra classi
Overriding.
Dichiarazione di classi Programmazione Corso di laurea in Informatica.
Lab. Calc. 2005/06 Ereditarietà. Lab. Calc. 2005/06 Scopo di questa lezione: Imparare a creare nuove classi ereditando da classi già esistenti. Capire.
1 laboratorio di calcolo II AA 2003/04 sesta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 quinta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
1 laboratorio di calcolo II AA 2003/04 quarta settimana a cura di Domizia Orestano Dipartimento di Fisica Stanza tel. ( )
Operatori E possibile ridefinire +, -, *, [], ++, ==, < class Vector2D { Friend operator+(const Vector2D& v1, const Vector2D& v2); public: Vector2D(double.
1 Ereditarietà Una classe può essere derivata da una classe esistente usando la sintassi: public, protected e private specificano il tipo di accesso ai.
Open Inventor (parte progetto) 1)Aggiungere alla classe base (delfino.h, Ufo.h, Veicolo.h, …) le inclusioni di open inventor: #include N.B.: Se si utilizzano.
Lezione XI Laboratorio di Programmazione. Ereditarieta Fondamentale proprieta dei linguaggi OO. Permette di specificare un nuova classe derivata da unaltra.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
IL TEMA DELLA RIUSABILITÀ Si vuole riusare tutto ciò che può essere riusato (componenti, codice, astrazioni) Non è utile né opportuno modificare codice.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Programmazione in Java (8)
AlgoLab - Ereditarieta' Ereditarietà e polimorfismo in Java Laboratorio di Algoritmi 02/03 Prof. Ugo de Liguoro.
I prodotti notevoli Quadrato di di binomio trinomio Quadrato di
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
void binario(int n); …………………
Puntatori e gestione dinamica della memoria
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 9 Tipi parametrici Collezioni generiche. Strutture matematiche parametriche.
Matrici: un’implementazione parametrica in C++
Corso di Informatica 2 a.a. 2003/04 Lezione 6
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Polimorfismo.
1 FONDAMENTI DI INFORMATICA II Ingegneria Gestionale a.a ° Ciclo Ereditarietà.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 2 La ricorsione Corso di Informatica 2 a.a. 2003/04 Lezione 2.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 5 Le strutture informative Corso di Informatica 2 a.a. 2003/04 Lezione 5.
Esercitazione Ereditarietà Polimorfismo. Entita’ Geometrica PuntoCerchioPoligono TriangoloQuadrilatero Rettangolo Quadrato.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 1 Cicli ed asserzioni Corso di Informatica 2 a.a. 2003/04 Lezione 1.
Ugo de'Liguoro - Informatica 2 - Introduzione Informatica 2 Introduzione al corso a.a. 2003/04.
Le funzioni Rassegna degli argomenti trattati LS Tron 14/15 Prof. Carla Fanchin.
Definizione di classi Capitolo 18 febbraio 2004 Definizione di classi.
AlgoLab - Code unificabili Code unificabili con alberi binomiali Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
4/5/2015E. Giovannetti -- OI09.1 Olimpiadi di Informatica 2010 Giornate preparatorie Dipartimento di Informatica Università di Torino marzo – Algoritmi.
ARGOMENTI PROPEDEUTICI
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
AlgoLab - MST code binomiali Algoritmi per il calcolo di MST: uso di code unificabili Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
AlgoLab - Pile e Code Pile e code Laboratorio di Algoritmi 02/03 Prof. Ugo de’ Liguoro.
Fondamenti di Informatica II Ingegneria Informatica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori.
Fondamenti di informatica Oggetti e Java Luca Cabibbo Luca Cabibbo – Fondamenti di informatica: Oggetti e Java Copyright © 2004 – The McGraw-Hill Companies.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Cose nuove di Java (prima a chiacchiera, poi formalmente)
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
La programmazione ad oggetti
Introduzione all’Ereditarietà Pietro Palladino. Richiami UML Classe: descrizione di un insieme di oggetti software con caratteristiche simili Definisce.
Prof. Cerulli – Dott. Carrabs
Oggetti Java.
Transcript della presentazione:

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Ereditarietà in C++

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Specializzazione e inclusione quindi Avremmo potuto definire S’ come: S’ è incluso in S perché la definizione di S’ specializza quella di S

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Specializzazione e algebre Un gruppo G = (S, +, 0,  ) è una struttura tale che … Un anello A = (S, +, 0, ,  ) è una struttura tale che: 1.(S, +, 0,  ) sia un gruppo commutativo 2.  distribuisca su + Un anello è un gruppo con opportune proprietà cui si aggiunge una nuova operazione (il prodotto).

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Gerarchie di specializzazione Membro-Università Amministrativo Studente-Triennio Studente-Biennio Dottorando Docente OrdinarioAssociatoRicercatore DipendenteStudente

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Gerarchie di specializzazione Figura Figura2D Figura3D Cerchio Triangolo Quadrato Sfera Cubo Tetraedro

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Classi base e classi derivate Se A deriva da B allora A è sottoclasse di B. Il processo di ideazione e realizzazione di un programma può vedersi come definizione di classi per progressivi specializzazione e reffinamento di una a più classi base Classe base: classe utilizzata per definire ulteriori specializzazioni Classe derivata: classe ottenuta per specializzazione di una o più classi Classe base: classe utilizzata per definire ulteriori specializzazioni Classe derivata: classe ottenuta per specializzazione di una o più classi

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Classi base e classi derivate class Point2D { private: double x, y; public: Point2D (double a, double b); void SetX( double a); void SetY( double b); double GetX() const { return x;} double GetY() const { return y;} };

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Classi base e classi derivate class Point3D : public Point2D { private: double z; public: Point3D (double a, double b, double c); void SetZ( double c); double GetZ() const { return z;} }; Classe derivata dalla classe base Point2D Una classe derivata possiede tutti i membri della classe base, cui se ne aggiungono degli altri.

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 La relazione “è un”: sottotipo Se Y è derivata di X, allora ogni oggetto di classe Y è un oggetto di classe X Se Y è derivata di X, allora ogni oggetto di classe Y è un oggetto di classe X Point3D p(1.0, 4.5, 0.0); cout << p.GetX(); // stampa 1 cout << p.GetZ(); // stampa 0 Point2D* pt = &p; // p è usato come Point2D pt->SetY(3); cout << p.GetY(); // stampa 3 double x = pt->GetZ(); // errore di tipo!!

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Visibilità class Point2D { private: double x, y; public: } class Point3D : public Point2D { private: double z; public:... double bump() const { return x;} // errore }; x è un campo privato della classe base

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Visibilità class Point2D { protected: double x, y; public: } class Point3D : public Point2D { private: double z; public:... double bump() const { return x;} // ok! }; x è un campo “protected” della classe base I campi “protected” sono visibili alla classe base ed a tutte le sue derivate

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Visibilità Nella derivazione “public”: i membri pubblici sono ovunque visibili; i membri privati sono visibili solo nella classe cui appartengono; i membri protected sono visibili nella classe cui appartengono ed in tutte le sue derivate. Nella derivazione “public”: i membri pubblici sono ovunque visibili; i membri privati sono visibili solo nella classe cui appartengono; i membri protected sono visibili nella classe cui appartengono ed in tutte le sue derivate. La modalità protected viola la regola di incapsulamento

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Overriding class Point2D { public:... void print(); }; void Point2D::print() { cout << x << ',' << y; } class Point3D { public:... void print(); }; void Point3D::print() { cout << GetX() << ',' << GetY() << ',' << z; } La nuova definizione di print() sostituisce la vecchia per i punti 3D

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Overriding void Point3D::print() { Point2D::print(); // chiama la funzione print della classe base cout << ',' << z; } La vecchia definizione di print() può essere usata nella nuova, ma si deve usare la risoluzione dello scope

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Overriding Una classe derivata può ridefinire un metodo (funzione membro) della classe base; la nuova versione deve avere lo stesso nome la stessa segnatura. Overriding: specializzazione dei metodi per gli oggetti di una classe derivata; contrapposto a Overloading: varianti di un metodo in funzione della segnatura.

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Costruttori class Point2D { protected: double x, y; public: Point2D (double a, double b) : x(a), y(b) {};... }; Costruttore analogo a: Point2D (double a, double b) { x = a; y = b;}

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Costruttori Point3D (double a, double b, double c) : Point2D(a,b) { z = c;} oppure Point3D (double a, double b, double c) : Point2D(a,b), z(c) {} In ogni caso il costruttore della classe base deve essere usato, e viene eseguito prima di quello della classe derivata

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 La relazione “ha un” template class Stack { private: List s; public: void push(T x) { s.InsertAtFront(x);} void pop (T& x){ s.RemoveFirst(x); } bool IsEmpty() { return s.IsEmpty();} };

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 La relazione “implementa in termini di” template class Stack : private List { public: void push(T x) { InsertAtFront(x);} void pop (T& x){ RemoveFirst(x); } bool IsEmpty() { return IsEmpty();} };

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Visibilità dei campi nelle derivazioni public e private class A { private: int x; protected: int y; public: int z; }; class B : private A { private: int a; protected: int b; public: c; // x non e’ accessibile; y e z lo sono }; class C : public B { public: // non sono accessibili x, y, z, a, // sono accessibili b, c }; ha l’effetto di rendere privati tutti i campi di classe A per gli oggetti di classe C (sottoclasse di B )

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Legami statici e dinamici class Strumentista { public: void chisono (){cout << “un strumentista”; virtual void cosasuono() {cout << “uno strumento”; } } class Violinista: public Strimentista { public: void chisono (){cout << “un violinista”; void cosasuono() {cout << “il violino”; } } Violinista v; Strumentista *ps = &v; ps->chisono(); // stampa “un strumentista” Ps->cosasuono(); // stampa “il violino”

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 11 Funzioni virtuali e classi astratte Il C++ ha legame statico, per ottenere gli effetti del legame dinamico i metodi che possono essere ridefiniti nelle sottoclassi devono essere preceduti da virtual class A { private: int x; public: virtual void f(){x = 0};} class B : public A { private: int y; public void f() {y = 1;} A a; B b; A* p = &a; p->f(); // pone a.x = 0 p = &b; p->f(); // pone b.y = 1 Una classe è astratta se contiene almeno un metodo virtuale puro, ossia (essenzialmente) privo di corpo virtual void g() = 0; // funzione virtuale pura è usata solo come classe base e non per produrre oggetti e definisce un’interfaccia.