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.

D (tip x): B (x) { ... }<br />

Relatia dintre o clasã derivatã D si clasa din care este derivatã B este o relatie de<br />

forma "D este un fel de B" ( “is a kind of “). Deci o multime vector este un fel de<br />

vector. La fel, o stivã vector este un fel de vector (un caz particular de vector).<br />

Pe lângã reutilizarea metodelor din superclasã <strong>în</strong> subcasã, derivarea creeazã tipuri<br />

compatibile si ierarhii de tipuri. Tipul unei clase derivate este subtip al tipului clasei<br />

din care derivã, asa cum tipul "int" poate fi considerat ca un subtip al tipului "long",<br />

iar tipul "float" ca un subtip al tipului “double”.<br />

Tipurile clasã obtinute prin derivare, ca si tipurile numerice din C, nu sunt<br />

independente <strong>în</strong>tre ele, formând o familie (o ierarhie) de tipuri compatibile. Un avantaj<br />

este acela cã functiile matematice din C (sqrt, exp, cos, etc.) au o singurã formã, cu<br />

argumente formale de tip “double”, dar pot fi apelate cu argumente efective de orice tip<br />

numeric. Conversia de la un tip mai general la un subtip se face automat <strong>în</strong> C si C++,<br />

dar <strong>în</strong> Java si C# numai folosind operatori de conversie “cast”. Exemplu:<br />

int x; double d=3.1415 ; x = (int) d; // <strong>în</strong> Java<br />

In C++ este permis ca un obiect de un tip mai general sã primeascã prin atribuire<br />

(sau sã fie <strong>în</strong>locuit, ca argument de functie) un obiect de un subtip al sãu. Exemplu:<br />

IntArray a; ArraySet s;<br />

a = s ; // “upcasting” = conversie in sus<br />

Justificarea este, <strong>în</strong> acest caz, cã orice multime vector poate fi consideratã ca un<br />

vector general. Trecerea inversã, de la un vector oarecare la o multime, nu este <strong>în</strong>sã<br />

posibilã decât dacã existã <strong>în</strong> subclasa “ArraySet” un constructor cu argument de tip<br />

“IntArray”, <strong>în</strong> care se asigurã unicitatea elementelor din multimea nou creatã.<br />

Reguli similare se aplicã la conversia de pointeri cãtre tipuri compatibile :<br />

IntArray * ap; ArraySet * sp;<br />

ap = sp; // conversie implicitã (in sus)<br />

sp = (ArraySet*) ap; // conversie explicitã (in jos) = downcasting<br />

Desi este posibilã sintactic, conversia <strong>în</strong> jos (la un subtip) poate conduce la efecte<br />

nedorite, dacã nu este folositã corect: dacã adãugãm vectorului adresat de “ap” mai<br />

multe elemente egale, acestea nu vor fi eliminate dupã conversia de pointeri :<br />

IntArray * ap; ArraySet * sp;<br />

for (int x=1;xadd( x%4); // metoda add” din “IntArray”<br />

sp = (ArraySet *) ap;<br />

sp->print(); // scrie 1,2,3,0,1,2,3,0,1

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

Saved successfully!

Ooh no, something went wrong!