1
Scopul lucrării:
·
Studierea polimorfismului;
· Studierea principiilor
legăturii întîrziate;
· Studierea funcţiilor
virtuale;
· Polimorfismul ad-hoc;
· Realizarea funcţiilor
virtuale;
· Studierea claselor abstracte
Sarcina lucrari:
Creaţi
clasa abstractă de bază Figure cu funcţia virtuală - aria. Square, Circle, Triangle, Trapeze în care
funcţia dată este predefinită. În funcţia main determinaţi
masivul de pointeri la clasa abstractă, cărei i se atribuie adresele obiectelor
claselor derivate. Aria trapezului: S=(a+b)h/2.
2 Indicatii
teoretice
Cuvântul polimorfism provine şi aproximativ se traduce
ca „multe forme” (poly – multe, morphos - formă). Cuvântul morphos
are legătură cu zeul grec Morphus, care putea să apară în vis oamenilor în
orişice formă în care el doreşte.
În viaţă tipurile polimorfe – sunt acelea, care se
caracterizează după o cantitate de diferite forme şi caracteristici. În chimie
legăturile polimorfe se pot cristaliza, cel puţin în două forme diferite (de
exemplu, carbonul are două forme cristaline –grafitul şi diamantul). Din alt
punct de vedere, inginerul TI este în primul rând om, dar apoi este inginer
(principiul de substituire).
În limbajele de programare un obiect polimorf – este esenţa
(variabilă, argumentul funcţiei), care păstrează, în timpul executării
programului valorile diferitor tipuri. Funcţiile polimorfe – sunt acele
funcţii, care au argumente polimorfe.
În С++ polimorfismul este o urmările obişnuită:
- Relaţia
"a fi exemplar";
- Mecanismul
de expediere a mesajelor;
- Moştenirea;
- Principiul
de substituire.
Unul din posibilităţile principale a utilizării programării
orientate pe obiecte, constă în posibilitatea de a combina aceste medii. În
rezultat se primeşte un set bogat de exemple tehnice împreună cu utilizarea
repetată a codului.
Variabila polimorfă: conţine valoarea, care se referă la
diferite tipuri de date. Variabilele polimorfe realizează principiul de
substituire. Cu alte cuvinte, cu toate că pentru asemenea variabile există un
tip de date aşteptat, tipul real poate fi un
subtip a tipului aşteptat. În C++ variabilele polimorfe există numai ca
referinţe şi pointeri.
Funcţiile polimorfe – este una din cele mai puternice tehnici
de programare obiect orientate. Ele permit concomitent să scrii cod la un nivel
înalt de abstractizare şi apoi sa-l utilizezi într-o situaţie concretă. De
obicei programatorul execută ajustarea codului
cu ajutorul transmiterii mesajelor adăugătoare destinatarului, care utilizează
metoda. Aceste metode adăugătoare, deseori nu sunt legate cu clasa la nivelul
abstractizării metodei polimorfe. Ele sunt metode virtuale, care se definesc
pentru clasele de nivel mult mai jos.
Când unei adevărate variabile (adică nu unei referinţe şi nu
a pointerilor) i se atribuie o valoare de tipul subclasa, atunci valoarea
clasei dinamice se transmite obligatoriu aşa, pentru a coincide cu tipul static
al variabilelor.
Totuşi la utilizarea referinţelor sau a pointerilor valoarea
salvează tipul său dinamic.
Legături
târzii
Sub
legături târzii trebuie de înţeles mecanismul care permite definirea tipului
dinamic în timpul executării programului, dar nu în timpul compilării. Un
mecanism asemănător sunt descriptorii de fişiere, aşa cum fişierele se deschid
în timpul executării programului, dar nu în timpul compilării. Acest mecanism
este baza polimorfismului, aşa cum realizează funcţiile virtuale.
Funcţiile
virtuale
Legăturile târzii rezolvă problema, dar, ea nu are cunoştinţe
nemijlocite în limbaj. De aceia, pentru referire el este necesar de utilizat
funcţiile virtuale, care se scriu cu utilizarea cuvântului rezervat virtual. Funcţiile virtuale se deosebesc
de cele obişnuite numai prin metodele de acces. Dar utilizarea lor are sens
numai cu utilizarea referinţelor sau a pointerilor.
3
Realizarea sarcinii:
Clasa de baza „Figure” contine o functie virtuala
„arie”
class Figure{
public:
virtual void arie(){};
};
Clasa derivata „patrat”
class patrat:public Figure{
double l; //lungimea laturei
public:
patrat():l(0){}; //constructor implicit
patrat(double l):l(l){}; //constructor
explicit
~patrat(){l=0;}; //destructorul
void arie(){ //funtia
de calculare a ariei patratului
double temp;
temp=l*4;
cout<<"Aria patratului este=
"<<temp;
return;
}; };
Clasa derivata „cerc”
class cerc:public Figure{
double r;
// raza cercului
public:
cerc():r(0){};
cerc(double r):r(r){};
~cerc(){r=0;};
void arie(){
double temp;
temp=PI*(pow(r,2)); //PI este definaita ! = 3.14159265
cout<<"Aria cercului este=
"<<temp;
return;
};
};
Clasa derivata „triunghi”
class triunghi:public Figure{
double a,b,c;
public:
triunghi():a(0),b(0),c(0){};
triunghi(double
a,double b,double c):a(a),b(b),c(c){};
~triunghi(){a=0; b=0; c=0;};
void arie();
};
void triunghi::arie(){
double p,A; //A – aria
p=(a+b+c)/2;
A=sqrt(p*(p-a)*(p-b)*(p-c));
cout<<"Aria Triunghiului este=
"<<A;
return ;
};
Clasa derivata „trapez”:
class trapez:public Figure{
double B,b,h;
public:
trapez(){B=0; b=0; h=0;};
trapez(double B,double b,double h):B(B),b(b),h(h){};
~trapez(){B=0; b=0; h=0;};
void arie();
};
void trapez::arie(){
double temp;
temp=(h*(b+B))/2;
cout<<"Aria Trapezului este=
"<<temp;
return ;
};
Functia „main”:
Dupa introducerea datelor se
afiseaza rezultatul.
Introducerea laturei
patratului
Introducerea razei cercului
Introducerea laturile
triunghiului
Introducerea trapezului
Concluzi:
In urma efectuării lucrării de
laborator date am făcut cunoștință cu polimorfizmul în limbajul C++. Am studiat
modalitățile de utilizare a lui și avantajele pentru lizibilitatea codului.
Acesta permite scrierea codului la nivel înalt de abstractizare și apoi
utilizarea în cazuri concrete.
Bibliografie
1 TOTUL
DESPRE C SI C++ (MANUALUL FUNDAMENTAL DE PROGRAMARE IN C SI C++)[RO][Kris
Jamsa][Lars Kland]
2 PROGRAMARE IN C_C++
CULEGERE DE PROBLEME Valiriu Iorga
3 Initiere in C++,
Programarea orientata pe obiecte (Editie Prevazuta) Cluj-Napoca 1993
Anexa A
#include <conio.h>
#include <iostream.h>
#include <math.h>
#define PI 3.14159265
class Figure{
public:
virtual void arie(){};
};
class patrat:public Figure{
double l; //lungimea
laturei
public:
patrat():l(0){};
patrat(double l):l(l){};
~patrat(){l=0;};
void arie(){
double temp;
temp=l*4;
cout<<"Aria patratului este=
"<<temp;
return;
};
};
class cerc:public Figure{
double r; // raza cercului
public:
cerc():r(0){};
cerc(double r):r(r){};
~cerc(){r=0;};
void arie(){
double temp;
temp=PI*(pow(r,2));
cout<<"Aria cercului este=
"<<temp;
return;
};
};
class triunghi:public Figure{
double a,b,c;
public:
triunghi():a(0),b(0),c(0){};
triunghi(double a,double b,double c):a(a),b(b),c(c){};
~triunghi(){a=0; b=0; c=0;};
void arie(); };
void triunghi::arie(){
double p,A;
p=(a+b+c)/2;
A=sqrt(p*(p-a)*(p-b)*(p-c));
cout<<"Aria Triunghiului este=
"<<A;
return ;
};
class trapez:public Figure{
double B,b,h;
public:
trapez(){B=0; b=0; h=0;};
trapez(double B,double b,double h):B(B),b(b),h(h){};
~trapez(){B=0; b=0; h=0;};
void arie(); };
void trapez::arie(){
double temp;
temp=(h*(b+B))/2;
cout<<"Aria Trapezului este=
"<<temp;
return ;
};
int main(){
Figure *x[4];
sus: clrscr();
cout<<"1 -
Patrat"<<endl;
cout<<"2 - Cerc"<<endl;
cout<<"3 -
Triunghi"<<endl;
cout<<"4 -
Trapez"<<endl;
cout<<"Esc -
Iesire"<<endl;
switch (getch())
{
case '1':{ clrscr(); double l;
cout<<"Introdu latura
patratului: ";
cin>>l;
patrat P(l);
x[0]=&P;
x[0]->arie(); break;};
case '2':{ clrscr(); double r;
cout<<"Introdu raza
cercului: ";
cin>>r;
cerc C(r);
x[1]=&C;
x[1]->arie(); break;};
case '3':{ clrscr(); double a,b,c;
cout<<"Introdu laturile
triunghiului..."<<endl;
cout<<"A= ";
cin>>a;
cout<<"B= ";
cin>>b;
cout<<"C= ";
cin>>c;
triunghi T(a,b,c);
x[2]=&T;
x[2]->arie();
break;};
case '4':{ clrscr(); double B,b,h;
cout<<"Introdu Baza
mare: "; cin>>B;
cout<<"Introdu Baza
mica: "; cin>>b;
cout<<"Introdu h=
"; cin>>h;
trapez Tr(B,b,h);
x[3]=&Tr;
x[3]->arie();
break;};
case 27:{ for (int
i=0; i<5; i++){
if (x[i]==NULL)
delete x[i]; }
exit(1);};
}
getch();goto sus;}
Niciun comentariu:
Trimiteți un comentariu