Programarea in limbajul C++ Moştenirea multiplă

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: