Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
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