Sunteți pe pagina 1din 28

C5: Supradefinirea operatorilor cont.

Cuprins:

Autoreferinta. Cuvantul cheie this Operatorul [ ]

Mostenire (derivare) Introducere Apelul constructorilor si al destructorilor Vizibilitatea in clasele derivate Exemple (multiple)

C5: Supradefinirea operatorilor cont.-

1. Autoreferinta. Cuvantul cheie this:

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.

C5: Supradefinirea operatorilor cont.-

Exemplu:

//nr. curent de elemente //adauga un element la sfarsit // afisare adresa lista

// 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; }

C5: Supradefinirea operatorilor cont.-

// 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->

tab[100]; nrcrt; adauga; adresa;


4

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

C5: Mostenirea (Derivarea)

3. Introducere:

Notiuni intalnite: clase de baza

clase derivate, superclase

subclase

Vehicole Marine Avioane

Clase de baza Clase de baza

Terestre

Aeriene Baloane

Clase derivate

Auto

Clase derivate
6

C5: Mostenirea (Derivarea)

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 }

C5: Mostenirea (Derivarea)

terestre::setmasa(int m) { v.setmasa(m); // doar paseaza argumentul functiei din clasa 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.

C5: Mostenirea (Derivarea)

// 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

C5: Mostenirea (Derivarea)


Clasa copil mosteneste de la clasa parinte datele si mai ales metodele; Nu am vorbit inca nimic despre constructori, destructor, vizibilitate!!!

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

C5: Mostenirea (Derivarea)

Exemplu:

#include <iostream.h> // clasa de baza A1 class A1 { int x; public: void set_x (int); void afisare_x (); } // date private

void A1::set_x (int n) { x = n; }

void A1::afisare_x () { cout << \n x = << x; }


11

C5: Mostenirea (Derivarea)

// clasa derivata A12 din A1 class A12 : public A1 { int y; public: void set_y (int); void afisare_y (); } // date private

void A12::set_y (int n) { y = n; }

void A12::afisare_y () { cout << \n y = << y; }

// 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

C5: Mostenirea (Derivarea)

3. Apelul constructorilor si al destructorilor:

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

A1::A1 () { cout << \n Constructor clasa de baza A1; }

13

C5: Mostenirea (Derivarea)


A1::~A1 () { cout << \n Destructor clasa de baza A1; } // clasa derivata A12 din A1 - completare

class A12 : public A1 { // .. public: A12 (); ~A12 (); } A12::A12 () { cout << \n Constructor clasa derivata A12; }

// constructor A12 // destructor A12

A12::~A12 () { cout << \n Destructor clasa derivata A12; }

14

// apel: void main () { A12 ob1; }

C5: Mostenirea (Derivarea)

// 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

Exemplu (transferul de parametri de la constructorul clasei derivate la constructorul clasei de baza) :

// constructor A1 // destructor A1
15

#include <iostream.h> // clasa de baza A1 class A1 { int a; public: A1 (int); ~A1 (); void afisare_a (); }

A1::A1 (int n) { cout << \n Constructor clasa de baza A1; a = n; }

C5: Mostenirea (Derivarea)

A1::~A1 () { cout << \n Destructor clasa de baza A1; }

void A1::afisare_a () { cout << \n a= << a; }

// constructor A12 // destructor A12


16

// clasa derivata A12 din A1 class A12 : public A1 { int b; public: A12 (int, int); ~A12 (); void afisare_b (); }

C5: Mostenirea (Derivarea)


A12::A12 (int m, int n) : A1 (m) { cout << \n Constructor clasa derivata A12; b = n; } A12::~A12 () { cout << \n Destructor clasa derivata A12; } void A12::afisare_b () { cout << \n b= << b; } // apel: void main () { A12 ob(10, 15); ob.afisare_a (); ob.afisare_b (); }

17

C5: Mostenirea (Derivarea)

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

Vizibilitatea membrilor protejati (in clasele derivate):


Indicator vizibilitate: public: accesibil protected: accesibil private: inaccesibil inaccesibil inaccesibil accesibil Accesibilitate Zona interesate: - din exterior - din clasa derivate - din exterior - din clasa derivate - din exterior - din clasa derivate

functiile friend din clasa de baza sic ea derivate pot accesa tipul protected;
18

C5: Mostenirea (Derivarea)


#include <iostream.h> // clasa de baza A1 class A1 { protected: int x, y; public: void set_xy (int, int); } void A1::set_xy (int a, int b) { x = a; y = b; }

Exemplu:

// clasa derivata A12 din A1 class A12 : public A1 { int z; public: void set_z (int); void afisare_xyz (); }

19

C5: Mostenirea (Derivarea)


void A12::set_z (int c) { z = c; } void A12::afisare_xyz () { cout << \n x= << x << \t y= << y << \t z= << z; } // apel: void main () { A12 ob; ob.set_xy (11, 15); ob.set_z (10); ob.afisare_xyz (); }

20

C5: Mostenirea (Derivarea)


# include <iostream.h> #include <string.h> #define MAX 20 // sau

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

C5: Mostenirea (Derivarea)

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; }

char * persoana::get_nume() { return nume; }

22

C5: Mostenirea (Derivarea)


char * persoana::get_prenume() { return prenume; } char * persoana::get_strada() { return strada; } int persoana::get_numar() { return numar; }

23

C5: Mostenirea (Derivarea)


// clasa student derivate din persoana class student:public persoana { double media; char specializarea [MAX]; char an [5]; int grupa; public: student (char *, char *, char *, int, double, char *, char *, int); void afisare_student(); double get_media(); char * get_specializarea(); char * get_an(); int get_grupa(); friend ostream & operator << (ostream &, student &); };

24

C5: Mostenirea (Derivarea)

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; }

double student::get_media() { return media; }

char * student::get_specializarea() { return specializarea; }

25

C5: Mostenirea (Derivarea)

char * student::get_an() { return an; }

int student::get_grupa() { return grupa; }

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

C5: Mostenirea (Derivarea)

// 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

C5: Mostenirea (Derivarea)

//!!! 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

S-ar putea să vă placă și