12.07.2015 Views

Cursul POO - Informatica aplicata si programare - Universitatea ...

Cursul POO - Informatica aplicata si programare - Universitatea ...

Cursul POO - Informatica aplicata si programare - Universitatea ...

SHOW MORE
SHOW LESS
  • No tags were found...

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

34Curs 1-2. Să ne reamintim …ppunctc1=&punctc1;ppunct1=(punct_plan*)&punctc1;ppunctc1=(punct_colorat*)&punct1;În concluzie, orice conver<strong>si</strong>e de la superclasă la subclasă trebuie făcută în modexplicit. În cazul conver<strong>si</strong>ei de la subclasă la superclasă, avem cazurile:• implicit dacă moştenirea este publică;• explicit, dacă moştenirea este privată;Faptul că printr-un pointer la clasa de bază putem accesa direct un obiect al uneiclase derivate public, duce la nişte consecinŃe extrem de interesante.1.3.3 Tablouri eterogene. FuncŃii virtualePână în acest moment, am fost obişnuiŃi ca tablourile să conŃină elemente deacelaşi tip. Aceste tablouri se numesc tablouri omogene.O observaŃie importantă care se impune este aceea că un pointer la o clasă de bază,poate păstra adresa oricărei instanŃieri a unei clase derivate public. Aşadar, având unşir de pointeri la obiecte de clasă de bază, înseamnă că unii dintre aceşti pointeri potreferi de fapt obiecte de clase derivate public din aceasta, adică tabloul de pointeri esteneomogen. Un astfel de tablou neomogen se numeşte eterogen.Limbajul C++ aduce un mecanism extrem de puternic de tratare de o manierăuniformă a tablourilor eterogene: funcŃiile virtuale.O funcŃie virtuală este o funcŃie care este prefixată de cuvântul cheie virtual,atunci când este declarată în clasa de bază. Această funcŃie este redeclarată în clasaderivată (cu aceeaşi semnătură, adică aceeaşi listă de parametri formali, acelaşi numeşi acelaşi tip returnat), şi prefixată de cuvântul cheie virtual.Să presupunem că un obiect instanŃiat dintr-o clasă D (care este derivată public dinsuperclasa B) este accesat folo<strong>si</strong>nd un pointer la un obiect de tip B. Să mai facempresupunerea că această clasă B declară o metodă virtuală M, care este apoi redeclaratăîn clasa D. Atunci când se încearcă apelarea metodei M, folo<strong>si</strong>nd pointerul la un obiectde tip B, compilatorul va lua decizia corectă şi va apela metoda virtuală M redeclaratăîn clasa D. Dacă metoda nu este declarată virtuală, la apelul metodei prin pointerul laclasa B, va fi apelată metoda clasei de bază.Comportamentul diferit al unei funcŃii cu acelaşi nume pentru obiecte dinsuperclasă, respectiv din clasele derivate, se numeşte polimorfism. În concluzie, înC++ polimorfismul este implementat prin funcŃii virtuale.Să verificăm această problemă într-un nou proiect, pe care să-l numim Virtual.class ObGrafic{public:ObGrafic();~ObGrafic();virtual void Desenez();} ;class Cerc: public ObGrafic{public:Cerc();~Cerc();virtual void Desenez();

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!