Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Cuprins
1. 2. 3. 4. 5. Polimorfismul ........................................................................................................................................ 1 Funcii virtuale ...................................................................................................................................... 2 Tabela virtual (virtual table) ................................................................................................................ 4 Destructor virtual .................................................................................................................................. 4 Exerciii .................................................................................................................................................. 5
1. Polimorfismul
Polimorfismul reprezint capacitatea unui obiect de tip A de a exista i de a fi utilizat precum un obiect de tipul B. Considernd exemplul claselor StudentAC si PersoanaAC, unde clasa StudentAC este o clasa derivat din clasa PersoanaAC, polimorfismul reprezint modul de utilizare a unui obiect StudentAC n locul unui obiect PersoanaAC pentru un obiect de tipul PersoanaAC. Altfel spus, un obiect de tipul unei clase derivate este compatibil ca pointer cu un obiect de tipul clasei de baz. Considernd implementrile precedente ale claselor PersoanaAC si StudentAC, un exemplu de utilizare a polimorfismului este:
StudentAC *s3 = new StudentAC ("1234567890122", "Ion", "Vaslui",2,10); StudentAC s4("7734567890122","Vasile","Neamt",3,7); PersoanaAC *ps2 = s3; PersoanaAC *ps3 = &s4; PersoanaAC &ps=s4; ps2->afisareProfil(); ps3->afisareProfil(); delete s3;
Consideram codul urmator:
Observam c pentru obiectul ps5 nu se apeleaz funcia afiare profil din StudentAC, ci se apeleaz funcia afisareProfil din clasa PersoanaAC. Pentru a corecta acest lucru, se introduce conceptul de funcii virtuale.
2. Funcii virtuale
O funcie virtual este un tip special de funcie care permite apelarea funciei din clasa cea mai derivat cu acelai prototip. O funcie a unei clase ce poate fi redefinit ntr-o clas derivat este o funcie virtual. Pentru a declara o funcie virtual, se folosete cuvntul cheie virtual naintea declarrii funciei. Pentru a putea apela funcia afisareProfil din clasa StudentAC pentru obiectul ps5, se va declara funcia afisareProfil din clasa de baza virtual:
class PersoanaAC { ... virtual void afisareProfil(); ... }; ... PersoanaAC *ps5 = new StudentAC ("9999567890122","Pavel", "Iasi",1,10); ps5->afisareProfil();
Observaii: Pentru o clas ce nu are nici o alt clas derivat din ea, folosirea funciilor virtuale nu este necesar! Se recomand a nu se face toate funciile virtuale pentru a spori claritatea codului scris! Folosirea funciilor virtuale presupune existena claselor derivate si a polimorfismului! O funcie definit virtual n clasa de baz, va rmne virtual n tot arborele ierarhic a acelei clase, indiferent cte niveluri are derivarea. n acest sens, utilizam exemplul urmtor:
class A { public: virtual void f() { cout << "Class A" << endl; } }; class B: public A { public: void f(int x) { cout << "Class B" << endl; } }; class C: public B { public: void f() { cout << "Class C" << endl; } }; int main() { B b; C c; A *pa1 = &b; A &pa2 = c; pa1->f(); pa2.f(); }
Class A Class C
In acest exemplu, Clasa B motenete clasa A, iar clasa C motenete clasa B. Funcia B::f nu este virtual i are prototipul diferit fa de funcia A::f. Deoarece C motenete i clasa A, funcia A::f() este virtual i pentru clasa C. Din acest motiv, la apelarea pa2.f() se apeleaz C::f() ca funcia cea mai derivat pentru un obiect de tipul C.
4. Destructor virtual
Destructorii claselor de baz trebuie declarai virtuali pentru a asigura apelarea destructorilor din clasele derivate. n caz contrar exist pericolul de a nu dealoca toat memoria utilizat. n cazul destructorilor, se apeleaz toi destructorii dinspre clasa derivat ctre clasa de baz (n ordinea invers a apelrii constructorilor).
5. Exerciii
Scriei un program ce conine o clasa de baz Figura si dou clase derivate din aceasta Cerc i Dreptunghi. Clasa Figura va avea un membru culoare de tip string metodele Perimetru() si Afisare() Clasa Patrat va avea: ca membri: o coordonatele x, y ale vrfului din stnga-jos al ptratului (de tip ntreg) o latura reprezentnd lungimea laturii ptratului (de tip double) Metodele Perimetru() i Afisare() Clasa Cerc va avea: Ca membri: o Coordonatele x, y ale centrului cercului (de tip ntreg) o Raza r (de tip ntreg) Metodele Perimetru() i Afisare() Cerine: o Completai clasele descrise mai sus cu constructorii necesari pentru a putea citi de la tastatur toi parametrii obiectelor ce vor fi instaniate din fiecare clas. o Completai clasele cu funciile Perimetru i Afisare. o Creai un tablou de pointeri la clasa Figura care s conin: o 2 obiecte de tip Cerc o 2 obiecte de tip Patrat o Utiliznd numai obiectele din acest tablou, testai metodele din clasele scrise. o Determinai obiectul cu aria maxima dintre elementele tabloului.