Documente Academic
Documente Profesional
Documente Cultură
Cuprins:
Mostenire (derivare) Introducere Apelul constructorilor si al destructorilor Vizibilitatea in clasele derivate Exemple (multiple)
Pentru a defini functiile membre sunt necesare referiri la datele membre ale clasei, fara a specifica un obiect anume. La apelare functia este informata asupra identitatii obiectului asupra caruia va actiona prin intermediul (transferul) unui parametru implicit care reprezinta adresa obiectului.
Exista situatii cand este necesar ca adresa obiectului sa fie utilizata in definitia functiei. Acest lucru este realizat prin intermediul lui this asociat unui pointer pentru care s-a apelat functia. this are sens numai in definitia unei functii membru.
Exemplu:
// lista de numere intregi class lista { private: int tab[100]; int nrcrt; public: void adauga(int); void adresa(); }
void lista::adresa() { cout << Adresa acestei liste este: << this; } void lista::adauga(int i) { // !!! eventuale teste de protectie this->nrcrt++; this->tab[nrcrt] = i; }
// utilizare: void main() { int i = 1; lista ls; ls.adauga(i); ls.adresa(); } this va puncta pe inceputul structurii clasei; *this inseamna referire la intregul obiect
this->
C5: Supradefinirea operatorilor cont.este denumit opetatorul deindexare ; este un operator (nestatic); functia operator []() trebuie sa fie membra a clasei ; apelare: x[n] al n-lea element al sirului (vectorului) x; x[n] x.operator [](n) .
2. Operatorul [ ]:
Exemplu:
class vector { //. public: int & operator [](int i); //.
} int & vector::operator [](int i) { assert (i >= 0 && i < this->size); return this -> p[i]; // return p [i];
// verificare index // elementele sunt elementare // int, float, . // trebuie sa suporte operatorul []
5
3. Introducere:
subclase
Terestre
Aeriene Baloane
Clase derivate
Auto
Clase derivate
6
Exemplu:
class vehicole { public: // constructori vehicole (); vehicole (int m); // interfata int getmasa () const; int setmasa (int m); private: int masa; }
// varianta I clase compuse: class terestre { public: void setmasa (int m); private: vehicole v; // contine un obiect tip vehicole }
Nu se introduc noi functionalitati cid oar se rescrie codul; clasa terestre trebuie sa fie un obiect de tip vehicole ; si nu terestre trebuie sa contina un obiect vehicole. => varianta cu clase compuse nu este cea mai favorabila.
// varianta II clase derivate: class terestre:public vehicole { public: terestre (); terestre (int m, int vit); // interfata void setviteza (int vit); int getviteza () const; private: int viteza; // date suplimentare }
// utilizare: terestre veh(1200, 200); void main() { cout << Greutatea vehicolului: << veh.getemasa () << Viteza: << veh.getviteza () << endl; }
9
Forma generala: class <clasa_derivata> : public <clasa_de_baza> { // membrii clasei derivate } O clasa derivata nu are acces la membrii private ai clasei de baza; O clasa derivata poate accesa membrii privati ai clasei de baza prin intermediul functiilor de interfata; O clasa derivata poate accesa membrii publici (si protejati) ai clasei de baza; Functiile friend nu se mostenesc; Exista 3 tipuri de mosteniri: = public(a); - cea mai intalnita = private - private; = protejata protected; - daca se doreste accesul la m clasei de baza este utilizat tipul protected.
10
Exemplu:
#include <iostream.h> // clasa de baza A1 class A1 { int x; public: void set_x (int); void afisare_x (); } // date private
// clasa derivata A12 din A1 class A12 : public A1 { int y; public: void set_y (int); void afisare_y (); } // date private
// apel: void main () { A21 ob1; ob1.set_x(11); // apel al fct. mostenite ob1.set_x(15); // apel al fct. suplimentare ob1.afisare_x (); // apel al fct. mostenite ob1.afisare_y (); // apel al fct. uplimentare } // nimic despre constructori si destructori
12
d.p.d.v. al ordinii, intai este apelat constructorul clasei de baza si apoi cel al clasei derivate; d.p.d.v. al ordinii, intai este apelat destructorul clasei derivate si apoi cel al clasei de baza; constructorii si operatorul de atribuire (=) nu sunt mosteniti de clasa derivate; in cazul in care constructorul clasei derivate este omis, constructorul implicit al clasei derivate va apela constructorul implicit al clasei de baza;
Exemplu:
#include <iostream.h> // clasa de baza A1 - completare class A1 { // .. public: A1 (); ~A1 (); }
// constructor A1 // destructor A1
13
class A12 : public A1 { // .. public: A12 (); ~A12 (); } A12::A12 () { cout << \n Constructor clasa derivata A12; }
14
// acest cod va determina apariria urmatoarelor mesaje: Constructor clasa de baza A1 Constructor clasa derivata A12 Destructor clasa derivata A12 Destructor clasa de baza A1
// constructor A1 // destructor A1
15
#include <iostream.h> // clasa de baza A1 class A1 { int a; public: A1 (int); ~A1 (); void afisare_a (); }
// clasa derivata A12 din A1 class A12 : public A1 { int b; public: A12 (int, int); ~A12 (); void afisare_b (); }
17
Forma generala (a constructorilor claselor derivate): <constr_clasa_derivata> (lista_arg_1) : <constr_clasa_de_baza> (lista_arg_2) lista_arg_2 inclusa in lista_arg_1
functiile friend din clasa de baza sic ea derivate pot accesa tipul protected;
18
Exemplu:
// clasa derivata A12 din A1 class A12 : public A1 { int z; public: void set_z (int); void afisare_xyz (); }
19
20
Exemplu (amplu):
// clasa de baza persoana class persoana { protected: char nume [MAX]; char prenume [MAX]; char strada [MAX]; int numar; public: persoana (char *, char *, char *, int); void afisare_persoana(); char * get_nume(); char * get_prenume(); char * get_strada(); int get_numar(); friend ostream & operator << (ostream &, persoana &); }
21
persoana::persoana (char * Num, char * Pren, char * Str, int N) { strcpy(nume, Num); strcpy(prenume, Pren); strcpy(strada, Str); numar = N; }
void persoana::afisare_persoana () { cout << \n Date personale: \n Nume: << nume << \t Prenume: << prenume << \t Strada: << strada << Nr. << numar; }
ostream & operator << (ostream & dev, persoana & p) { dev << \n Date personale: \n Nume: << p.nume << \t Prenume: << p.prenume << \t Strada: << p.strada << Nr. << p.numar; }
22
23
24
student::student (char * Num, char * Pren, char * Str, int N, double M, char * S, char * A, int G) : persoana (Num, Pren, Str, N) { media = M; strcpy(specializarea, S); strcpy(an, A); grupa = G; }
25
void student::afisare_student () { cout << \n\t Afisare date student:; afisare_persoana (); cout << \n Specializarea: << specializarea << \t anul: << anul << \t grupa: << grupa << \t media: << media; }
ostream & operator << (ostream & dev, student & s) { dev << \n\t Afisare date student: << (persoana)s; dev << \n Specializarea: << s.specializarea << \t anul: << s.anul << \t grupa: << s.grupa << \t media: << s.media; }
26
// utilizare: void main () { student s1(Ionescu, Ana, Turda, 2, 9.77, Automatica, 2aa, 321); student *ps2 = NULL; persoana p1(NNN, PPP, SSSS, 3); persoana *pp2 = NULL; s1.afisare_student (); cout << \n Afisare student cu operatorul << \n; cout << s1 << \n; p1.afisare_persoana (); cout << \n Afisare persoana cu operatorul << \n; cout << p1 << \n; // apelul functiilor mostenite din clasa de baza cout << \n Nume: << s1.get_nume << Prenume << s1.get_prenume;
27
//!!! conversii de tip (tratarea unui strudent ca persoana) pp2 = &s1; cout << \n studentul s1 adresat prin pointer catre persoana << *pp2; // !!! tratarea unui obiect strudent ca un obiect strudent prin prin apelul // operatorului cast (conversie de tip) ps2 = (student *) pp2; cout << *ps2 << Media: << ps2->get_media ();
28