17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

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

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

};<br />

Vom folosi clasa “Array” pentru obiecte de douã tipuri diferite, ambele derivate din<br />

tipul “Object”: clasele “Int” si “Date” :<br />

void main () {<br />

Array a(10);<br />

Date * d2 = new Date (31,12,2004);<br />

Date * d1 = new Date (1,1,2005);<br />

a.add (d1); a.add(d2);<br />

a.print();<br />

a.add (new Int(5)); a.add (new Int(7));<br />

a.print();<br />

}<br />

Utilizarea clasei “Array” aratã cã metoda “print” afiseazã adresele obiectelor<br />

reunite <strong>în</strong>tr-un obiect “Array” (si nu datele din aceste obiecte), iar metoda “contains”<br />

nu dã rezultate corecte. Explicatia este aceea cã metoda “print” din clasa “Array”<br />

apeleazã mereu metoda “print” din clasa “Object”, indiferent de tipul real al obiectelor.<br />

O solutie ar fi ca sã determinãm la executie tipul obiectelor memorate si sã apelãm<br />

metoda de afisare corespunzãtoare acestui tip. In acest scop am putea adãuga clasei<br />

“Object” si subclaselor sale o metodã “getType” având ca rezultat tipul obiectelor (un<br />

nume sau un numãr unic pentru fiecare clasã).<br />

Solutia aplicatã <strong>în</strong> C++ si <strong>în</strong> toate limbajele orientate pe obiecte care au urmat<br />

foloseste functii virtuale (sau polimorfice) <strong>în</strong> locul determinãrii tipului la executie.<br />

O metodã declaratã virtual <strong>în</strong> clasa de bazã si apelatã prin intermediul unui pointer<br />

sau printr-o referintã la clasa de bazã, produce executia unei secvente diferite, <strong>în</strong><br />

functie de tipul pointerului sau referintei (de tipul obiectului referit). Exemplu:<br />

class Object {<br />

public:<br />

virtual void print( ) {cout print(); // apeleaza functia Date::print()<br />

}<br />

In clasele derivate nu mai trebuie folosit cuvântul virtual la redefinirea metodelor<br />

virtuale, deci definitiile anterioare ale claselor “Date” si “Int” nu se modificã.<br />

Compilatorul trateazã diferit metodele virtuale de celelalte metode: fiecare obiect<br />

dintr-o clasã cu metode virtuale contine, pe lângã date, si adresa unui tabel de metode

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

Saved successfully!

Ooh no, something went wrong!