Sunteți pe pagina 1din 5

Ce este polimorfismul?

Polimorfismul. n Polimorfismul este capacitatea unor entități


de a lua forme diferite.
Funcţii Virtuale.
n Etimologia polimorm: Poly = multe + Morfm =
Clase Abstracte forma
n Este unul din conceptele esențiale din POO
Mihai Gabroveanu

Polimorfismul. Funcţii Virtuale 2

Tipuri de polimorfism (I) Tipuri de polimorfism (II)


n Polimorfismul parametric – mecanismul prin n Polimorfismul de moștenire – mecanismul prin
care putem defini o metodă cu același nume care o metodă din clasa de bază este
în aceași clasă, funcții care trebuie să difere redefinită cu aceiași parametri în clasele
prin numărul și/sau tipul parametrilor. Selecția derivate. Selecția funcției se va realiza la
rulare (legarea întârziată (late binding,
funcției se realizează la compilate (legarea dynamic binding, runtime binding)).
timpurie (early binding)).
n În limbajul C++ este implementat cu ajutorul
funcțiilor virtuale

Polimorfismul. Funcţii Virtuale 3 Polimorfismul. Funcţii Virtuale 4


Upcasting – Conversia Tipurilor Exemplu
n Upcasting = conversia obiectelor claselor derivate către obiecte ale
claselor de bază
n Considerăm următoarea ierahie de clase:
class B;
class D: public B{
};
atunci:
B b, *pb; D d,*pd;
… Upcasing
b = d;
pb=pd;
d=b Downcasting
pd=pb; (incorect)

Polimorfismul. Funcţii Virtuale 5 Polimorfismul. Funcţii Virtuale 6

Exemplu (cont.) Exemplu (cont.)


int main(){
Animal *a = new Animal("Jerry");
class Animal { class Pisica : public Animal{ Pisica *t = new Pisica("Tom");
protected: public: Caine *c = new Caine("Azorel");
char nume[100]; Pisica(char* nume):Animal(nume) {}
public: char* sunet() { cout << a->getNume() << ": " << a->sunet() << endl;
Animal(char *nume){ return "Miau!"; cout << t->getNume() << ": " << t->sunet() << endl;
strcpy(this->nume,nume); } cout << c->getNume() << ": " << c->sunet() << endl;
} }; a=t;
char* sunet(){ cout << a->getNume() << ": " << a->sunet() << endl;
return "nu stiu"; class Caine : public Animal{ c=a;//incorect
} public: c=t;//incorect
char* getNume(){ Caine(char* nume):Animal(nume) {} }
return nume; char* sunet(){
} return "Ham!"; OUTPUT:
}; } Jerry : nu stiu
}; Tom : Miau!
Azorel : Ham!
Tom : nu stiu! ???

Polimorfismul. Funcţii Virtuale 7 Polimorfismul. Funcţii Virtuale 8


Funcții virtuale Apelul funcțiilor virtuale
n O funcție virtuală este o funcție membră a unei n Cuvântul cheie virtual permite implementarea legăturilor dinamice la
apelul funcției prin intermediul unui pointer al clasei de bază. Mai exact,
clase care poate fi înlocuită, în momentul execuției dacă un pointer al clasei de bază indică către un obiect din ierarhie atunci
se selectează la rulare versiunea de funcție corespunzătoare tipului de
programului, cu o funcție membru din clasa derivată. obiect referit.
n Sintaxa declarării: n De exemplu:
IdClasaDerivata d;
class IdClasaBaza{ IdClasaBaza *p = &d;
virtual tip idMetodaV(lista_parametri); p->idMetodaV(); //va apela metoda definită în clasa IdClasaDerivata.
}; IdClasaBaza b=d;

class IdClasaDerivata : IdClasaBaza{ b.idMetodaV(); //va apela metoda definită în clasa IdClasaBaza
tip idMetodaV(lista_parametri);
};

Polimorfismul. Funcţii Virtuale 9 Polimorfismul. Funcţii Virtuale 10

Exemplu Avantaje
sunet() devine virtuală
class Animal {
protected:
char nume[100];
for(int i = 0; i < 3; i++) {
cout<<animale[i]->getNume()<< ":"; n Putem trata colecții de obiecte ale aceleiași
public: cout<<animale[i]->sunet()<< endl;
Animal(char *nume);
virtual char* sunet();
} ierarhii într-o manieră unitară deoarece funcţia
};
char* getNume(); }
apelată virtual este identificată la rulare cu
void main(){
Animal* animale[] = {
Output:
Felix: Miau!
funcţia membră din clasa căreia îi aparţine
new Pisica("Felix"),
new Caine("Azorel"),
Azorel: Ham!
Tom: Miau!
obiectul
new Pisica("Tom")
}; n Putem asigura independența implementărilor

Polimorfismul. Funcţii Virtuale 11 Polimorfismul. Funcţii Virtuale 12


Constructori și Destructori Exemplu
class Persoana { Angajat(char *nume="", char * functia):
protected: Persoana(nume) {

n Constructori nu pot fi funcții virtuale. char *nume;


public:
this->functia = new char[strlen(functia)+1];
strcpy(this->functia, functia);
Persoana(char *nume="") { }
this->nume = new char[strlen(nume)+1]; ~Angajat() {
n Destructori pot fi funcții virtuale. Uneori chiar }
strcpy(this->nume, nume); if (functia){
delete []functia;
virtual ~Persoana() { functia = 0;
este necesar acest lucru. if (nume){
delete []nume;
}
cout << "Distruge obiectul Angajat " << endl;
nume = 0; }
} };
cout << "Distruge obiectul de Persoana " <<
endl; int main() {
} Persoana* p = new Angajat("Mircea","Sudor");
}; delete p; //Apelează destructorii ~Persoana()
si ~Angajat()
class Angajat : public Persoana {
char * functia; return 0;
public: }

Ce se întâmplă dacă destructorul clasei persoana nu este virtual?

Polimorfismul. Funcţii Virtuale 13 Polimorfismul. Funcţii Virtuale 14

Funcții virtuale pure Clase Abstracte


n Funcții virtuale pure sunt funcții virtuale ce n O clasă abstractă este o clasă care conține
sunt doar declarate în clasa de bază, urmând cel puțin o funcție virtuală pură.
ca acestea sa fie definite în clasele derivate. n Nu putem crea instanțe ale claselor abstracte
n Sintaxa: n Puntem însă declara pointeri
class IdClasaBaza{
n Dacă o clasă moștenește o clasă abstractă și
virtual tip idMetodaVirtPura(lista_parametri) = 0;
};
nu implementează toate metodele virtuale
pure atunci ea devine clasă abstractă.

Polimorfismul. Funcţii Virtuale 15 Polimorfismul. Funcţii Virtuale 16


Exemplu Exemplu (cont.)
Clasa abstracta Metoda virtuala pură Metoda e redefinită
(nu are definiție)

class FiguraGeometrica { Cerc (Punct c, float r);


public: float getPerimetrul();
virtual float getPerimetrul() = 0; void print();
virtual void print(); };
Cerc::Cerc(Punct c, float r):centru(c),
}; raza(r){
}
void FiguraGeometrica::print(){
cout<<"Figura Geometrica Oarecare"<<endl; float Cerc::getPerimetrul() {
} return 2*M_PI*raza;
}
class Cerc: public FiguraGeometrica { void Cerc::print(){
Punct centru; cout<<"Cerc ("<<centru<<","<<raza<<")"<<endl;
float raza; }
public:

Polimorfismul. Funcţii Virtuale 17 Polimorfismul. Funcţii Virtuale 18

Exemplu (cont.) Temă


class Dreptunghi: public FiguraGeometrica {
Punct colt_s_s; //colt stanga sus
void Dreptunghi::print(){
cout<<"Dreptunghi
n Implementati următoarea ierahie de clase:
Punct colt_d_j; //colt dreapta jos ["<<colt_s_s<<","<<colt_d_j<<"]"<<endl;;
public:
Dreptunghi (Punct c_s_s, Punct c_d_j);
} Animal, Mamifer, AnimalZburator, Liliac.
float getPerimetrul(); void main(){

};
void print(); FiguraGeometrica *f[]={new Cerc(Punct(0,0),1),
new Dreptunghi(Punct(0,1),Punct(2,0))};
n Imlementați o ierarhie de clase care reprezintă
Dreptunghi::Dreptunghi(Punct c_s_s, Punct
for(int i=0;i<2;i++){
f[i]->print(); articolele dintr-o bibliotecă.
c_d_j): colt_s_s(c_s_s), colt_d_j(c_d_j){ cout<<"Perimetrul="<<f[i]->
} getPerimetrul()<<endl;
float Dreptunghi::getPerimetrul() { }
return 2*(colt_d_j.getX()- }
colt_s_s.getX())+2*(colt_s_s.getY()-
colt_d_j.getY());
}

Polimorfismul. Funcţii Virtuale 19 Polimorfismul. Funcţii Virtuale 20

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