Programare orientata pe obiecte - curs2013).pdf · Clasa valoare este o clasa template care depinde...
Transcript of Programare orientata pe obiecte - curs2013).pdf · Clasa valoare este o clasa template care depinde...
LECTOR ADRIAN RUNCEANU
Programare orientată pe obiecte
Universitatea “Constantin Brâncuşi” din Târgu-Jiu
Facultatea de Inginerie
Departamentul de Automatică, Energie şi Mediu
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
2
Curs 10
Derivarea(moştenirea) claselor template
Moştenirea claselor template
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
3
Mostenirea (derivarea) claselor template se face la fel ca si in cazul claselor obisnuite.
Nu exista restrictii in ceea ce priveste derivarea claselor.
Regulile sunt aceleasi.
Moştenirea claselor template
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
4
O clasa derivata template se declara astfel:
template<class T> class clasa_derivata : public clasa_baza<T> { . . . . }
template<class T> class clasa_derivata : public clasa_baza<T> { . . . . }
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
5
Un constructor al unei clase derivate template, care apeleaza un constructor al clasei de baza se declara astfel:
Moştenirea claselor template
template<class T> class clasa_derivata::clasa_derivata(lista parametri formali) : clasa_baza<T>(lista parametri efectivi) { . . . . }
template<class T> class clasa_derivata::clasa_derivata(lista parametri formali) : clasa_baza<T>(lista parametri efectivi) { . . . . }
Exemplu 1
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
6
Clasa valoare este o clasa template care depinde de tipul formal T.
Aceasta clasa are ca data membru pe v, care este tot de tipul T.
In plus, clasa are si un constructor care are rolul de a-i atribui o valoare lui v.
Clasa val mosteneste clasa valoare, iar constructorul ei, apeleaza constructorul clasei valoare.
In plus clasa val mai are o metoda de afisare a lui v.
Exemplu 1
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
7
class valoare
T v;
constructor
class val:valoare
constructor
afisez()
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
8
#include<iostream.h>
template <class T> class valoare{
protected:
T v;
public:
valoare(T v);
};
Exemplu 1
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
9
template<class T> valoare<T>::valoare(T v)
{
this->v=v;
}
Exemplu 1
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
10
// clasa derivata din clasa valoare
template<class T> class val:public valoare<T>
{
public:
void afisez();
val(T v);
};
Exemplu 1
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
11
template<class T> val<T>::val ( T v ) : valoare<T> (v) { };
template<class T> void val<T>::afisez()
{
cout<<this->v<<endl;
}
Exemplu 1
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
12
int main()
{
val<int> ob(100);
ob.afisez();
}
Exemplu 1
Executia programului are ca efect:
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
13
Clasa matrice poate prelucra matrici de tipul formal T.
Acestea vor fi alocate dinamic pentru a putea utiliza eficient memoria.
Dimensiunile matricei si anume, numarul de linii, notat cu m si numarul de coloane notat cu n vor fi citite de la tastatura, iar matricea va fi alocata dinamic dupa valorile lui m si n.
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
14
Clasa matrice va supraîncărca şi operatorul () pentru ca să se poată utiliza un obiect de tip matrice:
într-o operaţie de atribuire ( exemplu: A(2,3)=5 )
sau pentru a se afişa elementul din matrice ( exemplu: cout<<A(3,4) )
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
15
Se va defini o clasă cu numele matrice_op care va deriva din clasa de bază matrice şi deci, va moşteni proprietăţile clasei respective.
Matricea sumă este alocată în memorie (pentru aceasta vom folosi referirea prin intermediul operatorului this), iar pentru a putea dubla spaţiul necesar alocării memoriei, am utilizat un constructor al clasei matrice_op, fără parametri, care rezervă spaţiu pentru matrice.
Astfel, o atribuire nu face decât să copieze pointer-ul reţinut de adr pentru matricea sumă.
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
16
Exemplu 2
class matrice
T **adr; int m,n
Constructor implicit Constructor de initializare
Operator ()
class matrice_op : matrice
Constructor implicit Constructor de initializare
Operator +
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
17
#include<iostream.h> template <class T> class matrice{ T** adr; protected: int m,n; public: matrice(); matrice(int m, int n); T& operator()(int i, int j); };
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
18
template<class T> matrice<T> :: matrice() { }; template<class T> matrice<T> :: matrice ( int m,
int n ) { this->m=m; this->n=n; adr=new T*[m]; // alocam un vector de m elemente de
tip pointer catre T
for(int i=0;i<m;i++) adr[i]=new T[n]; // alocam n elemente de tipul T
}
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
19
template<class T> T& matrice<T> :: operator() (int i, int j)
{
T* adr_linie=adr[i]; // in variabila vector
adr_linie retinem linia i din matrice
return adr_linie[j]; // in vectorul
adr_linie, elementul cautat se afla pe pozitia j
}
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
20
// clasa matrice_op derivata din clasa matrice
template<class T> class matrice_op:public matrice<T>{
public: matrice_op(); matrice_op(int m,int n); matrice_op
operator+(matrice_op<T> M); };
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
21
// constructorul implicit mosteneste constructorul implicit al clasei de baza
template<class T> matrice_op <T> :: matrice_op() { }
// constructorul mosteneste constructorul clasei de baza
template<class T> matrice_op <T> :: matrice_op(int m, int n) : matrice<T> (m, n) { }
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
22
template<class T> matrice_op<T>
matrice_op<T> :: operator+ (matrice_op<T> M)
{
matrice_op<T> S(this->m, this->n);
for(int i=0; i < this->m; i++)
for(int j=0; j < this->n; j++)
S(i,j) = (*this)(i,j) + M(i,j);
return S;
}
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
23
int main()
{
int m, n, i, j;
cout<<"Dati nr. de linii m = "; cin>>m;
cout<<"Dati nr. de coloane n = "; cin>>n;
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
24
cout<<"Se creeaza matricea A \n";
matrice_op<int> A(m,n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
cout<<"A("<<i+1<<","<<j+1<<")= ";
cin>>A(i,j);
}
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
25
cout<<"Se creeaza matricea B \n";
matrice_op<int> B(m,n);
for(i=0; i<m; i++)
for(j=0; j<n; j++)
{
cout<<"B("<<i+1<<","<<j+1<<")= ";
cin>>B(i,j);
}
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
26
cout<<"Suma celor doua matrici \n";
matrice_op<int> C(m,n);
C = A + B;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++) cout<<C(i,j)<<" ";
cout<<"\n";
}
}
Exemplu 2
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
27
Executia programului are ca efect:
Exemplu 2
Exemplu 3
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
28
Să se adauge clasei matrice_op o metodă care să permită înmulţirea a două matrice.
Se va adăuga următoarea metodă în clasa matrice_op:
matrice_op operator*(matrice_op<T> M);
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
29
template<class T> matrice_op<T> matrice_op<T>::operator*(matrice_op<T> M)
{ matrice_op<T> C(m,n); for(int i=0; i < this->m; i++) for(int j=0; j < this->n; j++) { C(i,j)=0; for(int k=0;k<this->m;k++) C(i,j) += (*this)(i,k) * M(k,j); } return C; }
Exemplu 3
Initializarea claselor de baza virtuale
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
30
O clasa de baza virtuala poate fi initializata explicit, dar ea trebuie sa aiba si un constructor care poate fi apelat fara argumente.
Acesta poate fi un constructor fara argumente sau un constructor in care toate argumentele au valori implicite.
Initializarea claselor de baza virtuale
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
31
Regulile de apelare a constructorilor claselor de baza sunt urmatoarele:
1. Constructorii claselor de baza virtuale se apeleaza inaintea celor corespunzatori claselor ne-virtuale
2. Pentru o clasa cu mai multe clase de baza virtuale:
constructorii acestora se apeleaza in ordinea in care clasele au fost declarate in lista
apoi se apeleaza constructorii claselor de baza ne-virtuale
si la sfarsit constructorii claselor derivate
Initializarea claselor de baza virtuale
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
32
3. Daca in ierahia claselor de baza exista mai multe instantieri ale unei clase de baza virtuale, constructorul respectiv va fi apelat doar o singura data
4. Daca in ierarhie exista atat instantieri virtuale cat si ne-virtuale ale aceleiasi clase de baza, constructorul va fi aplelat o singura data pentru toate instantierile virtuale si de fiecare data pentru fiecare instantiere ne-virtuala
Initializarea claselor de baza virtuale
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
33
Situatii in care este necesara utilizarea claselor virtuale:
Exemplu 1:
Clasele inginer si cont mostenesc clasa persoana ca, clasa de baza virtuala, pentru ca trebuie sa existe un singur sub-obiect al acestuia, comun pentru inginer si cont, iar clasa director_proiect este derivata din ambele clase virtuale.
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
34
class persoana
nume, adresa, varsta
Constructor de initializare
class inginer: virtual persoana
Specialitate
Constructor de initializare
class cont: virtual persoana
numar, banca, suma
Constructor de initializare
class director_proiect : inginer, public cont
titlu
Constructor de initializare
Exemplu 1 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
35
#include<iostream.h>
class persoana{
protected:
char *nume;
char *adresa;
int varsta;
Exemplu 1 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
36
void set_pers(char *n, char *a, int v){ nume=n; adresa=a; varsta=v; cout<<nume<<"\n"; cout<<" "<<adresa<<"\n"; cout<<" "<<varsta<<"\n"; } public: persoana(){ cout<<"Constructor persoana: "; } };
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
37
class inginer: virtual public persoana{
protected:
char *specialitate;
public:
inginer(char *n, char *a, int v, char *s) : specialitate(s)
{
set_pers(n,a,v);
cout<<"Constructor inginer: " << specialitate<<"\n";
}
};
Exemplu 1 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
38
class cont: virtual public persoana{
protected:
int numar;
char* banca;
int suma;
Exemplu 1 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
39
public: cont(int nr, char *b, int sum):numar(nr), banca(b), suma(sum) { cout<<"Constructor cont: "<<numar<<"\n"; cout<<" Banca:"<<banca<<"\n"; } void afis_cont(){ cout<<"Informatii cont:\n"; cout<<nume<<"\n"<<adresa<<"\n"<<" Cont nr: "<<numar <<"\n"; cout<<"Banca: "<<banca<<"\n"<<"Suma: "<<suma<<"\n"; }; };
Exemplu 1 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
40
class director_proiect: inginer, public cont { char *titlu; public: director_proiect(char *n, char *a, int v, char *spec, int nr, char *b, int sum, char *t): inginer(n,a,v,spec), cont(n,a,v,nr,b,sum), titlu(t) { cout<<"Constructor director proiect: "<<titlu<<"\n"; } };
Exemplu 1 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
41
int main()
{
director_proiect dp("Ionescu Vasile","Str. Republicii",45,"Automatica", 987654,"BancPost", 100000,"Implementare C++");
dp.afis_cont();
}
Exemplu 1 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
42
Exemplu 2:
Se considera ierarhia de clase din figura urmatoare, in care clasele cerc si varf mostenesc clasa de baza punct_2d, pentru a putea exista doua sub-obiecte ale acesteia, unul corespunzator centrului cercului de baza al conului, iar altul corespunzator varfului conului – clasa con.
Exemplu 2 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
43
class punct_2d
x, y
Constructor de initializare
class cerc: public punct_2d
raza, aria, perimetru
Constructor de initializare
class varf: public punct_2d
z
Constructor de initializare
class con: public cerc, varf
volum
Constructor de initializare
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
44
#include<iostream.h>
class punct_2d{
protected:
float x,y;
public:
punct_2d(float xx=0, float yy=0):x(xx),y(yy){
cout<<"Constructor punct_2d\n";
}
};
Exemplu 2 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
45
class cerc : public punct_2d{
protected:
float raza, aria, perimetru;
public:
cerc(float xx=0, float yy=0, float rr=1) : punct_2d(xx, yy), raza(rr){
cout<<"Constructor cerc\n";
}
};
Exemplu 2 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
46
class varf : public punct_2d{
protected:
float z;
public:
varf(float xx=0, float yy=0, float zz=1) : punct_2d(xx, yy), z(zz){
cout<<"Constructor varf\n";
}
};
Exemplu 2 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
47
class con : cerc,varf{
float volum;
public:
con(float a, float b, float c, float d, float e, float f) : cerc(a,b,c),varf(d,e,f){
volum=0;
cout<<"Constructor con\n";
}
};
Exemplu 2 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
48
int main()
{ con c(1,1,1,1,1,1); }
Dupa executia programului:
Exemplu 2 – ierarhii de clase
13.11.2013 Curs - Programare orientată pe obiecte C++/Java
49
Întrebări?