Sunteți pe pagina 1din 7

Universitatea Tehnică a Moldovei

Facultatea de Calculatoare, Informatică și Microelectronică


Departamentul de Informatică și Ingineria Sistemelor

REFERAT
la lucrarea de laborator Nr. 6
Disciplina:”Programare Orientată pe Obiect”

Tema:

Polimorfism. Funcţii virtuale

A elaborat : Rotaru Dan


A verificat : Mititelu Vitalie

Chişinău – 2021
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:
Varianta 1
Creaţi clasa abstractă de bază Worker cu funcţia virtuală calcularea salariului. Creaţi clasele
derivate StateWorker, HourlyWorker şi CommissionWorker, în care funcţia dată este
redefinită. În funcţia main determinaţi masivul de pointeri la clasa abstractă, cărei i se
atribuie adresele obiectelor claselor derivate.
Rezolvare:
Codul programului:

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;

//Clasa abstracta Worker cu functie virtuala


class Worker{
public:
char *nume_lucrator;
char *job;
public:
virtual float calcularea_salariului()=0 ; //functia virtuala
Worker(char *nume_lucrator, char *job);
~Worker() {delete []nume_lucrator; delete []job; };

void afis() {cout<<"Nume, prenume: "<<this->nume_lucrator<<endl;


cout<<"Functia: "<<this->job<<endl;}
};
Worker::Worker(char *nume_lucrator, char *job) {
this->nume_lucrator=new char[strlen(nume_lucrator)+1];
strcpy(this->nume_lucrator, nume_lucrator);
this->job=new char[strlen(job)+1];
strcpy(this->job,job);
}

//Clasa StateWorker:
class StateWorker: public Worker{
public:
float salariul;
public:
float calcularea_salariului(); //in clasa de baza e vituala
StateWorker(char *nume_lucrator, char *job, float salariu);
~StateWorker(){salariul=0;} ;
void afis();
};
StateWorker::StateWorker(char *nume_lucrator, char *job, float salariul) :
Worker(nume_lucrator, job){
this->salariul=salariul;
}
void StateWorker::afis(){
Worker::afis();
cout<<"Salariul: "<<this->salariul<<endl;
}
float StateWorker::calcularea_salariului(){
cout<<"Salariul final : "<<this->salariul<<" lei"<<endl;
return this->salariul;
}
//Clasa HourlyWorker:
class HourlyWorker: public Worker{
public:
float tarif_pe_ora;
float ore_lucrate;
public:
float calcularea_salariului(); //in clasa de baza e virtuala
HourlyWorker(char *nume_lucrator, char *job, float tarif_pe_ora,float
ore_lucrate);
~HourlyWorker(){tarif_pe_ora=0; ore_lucrate=0;} ;
void afis();
};
HourlyWorker::HourlyWorker(char *nume_lucrator, char *job, float tarif_pe_ora,float
ore_lucrate) : Worker(nume_lucrator, job){
this->tarif_pe_ora=tarif_pe_ora;
this->ore_lucrate=ore_lucrate;
}
void HourlyWorker::afis(){
Worker::afis();
cout<<"Tarif/ora: "<<this->tarif_pe_ora<<endl;
cout<<"Ore lucrate: "<<this->ore_lucrate<<endl;
}
float HourlyWorker::calcularea_salariului(){
float salariul=(this->tarif_pe_ora) * (this->ore_lucrate);
cout<<"Salariul lucratorului : "<<salariul<<" lei"<< endl;
return salariul;
}

//Clasa CommissionWorker:
class CommissionWorker: public Worker{
public:
float salariu_de_baza;
float procent_din_vanzari;
float vanzari_efectuate;
public:
float calcularea_salariului(); //in clasa de baza e vituala
CommissionWorker(char *nume_lucrator, char *jo_name,float salariu_de_baza,
float procent_din_vanzari,float vanzari_efectuate);
~CommissionWorker(){procent_din_vanzari=0; vanzari_efectuate=0;} ;
void afis();
};
CommissionWorker::CommissionWorker(char *nume_lucrator, char *job ,float
salariu_de_baza, float procent_din_vanzari,float vanzari_efectuate) : Worker(nume_lucrator,
job){
this->salariu_de_baza=salariu_de_baza;
this->procent_din_vanzari=procent_din_vanzari;
this->vanzari_efectuate=vanzari_efectuate;
}
void CommissionWorker::afis(){
Worker::afis();
cout<<"Salariu de baza: "<<this->salariu_de_baza<<" lei"<<endl;
cout<<"Procent din vanzari: "<<this->procent_din_vanzari<<" %" <<endl;
cout<<"Vanzari efectuate: "<<this->vanzari_efectuate<<" lei"<<endl;
}
float CommissionWorker::calcularea_salariului(){
float salariul=(this->salariu_de_baza) + (this->procent_din_vanzari)/100 * (this-
>vanzari_efectuate);
cout<<"Salariul calculat: "<<salariul<<" lei"<< endl;
return salariul;
}

//Program principal:
int main(void){
char nume_prenume[60], functie[30];
float salariu, tarif, nr_ore, procent, suma_vanzari;
cout<<endl;

strcpy(nume_prenume,"Albot Elena");
strcpy(functie,"Programator");
salariu=6785;

StateWorker a(nume_prenume, functie, salariu);


Worker *p1=&a;
a.afis();
p1->calcularea_salariului();
cout<<endl<<endl;

strcpy(nume_prenume,"Cristina Iordache");
strcpy(functie,"Meneger");
tarif=75;
nr_ore=135;

HourlyWorker b(nume_prenume, functie, tarif, nr_ore);


Worker *p2=&b;
b.afis();
p2->calcularea_salariului();
cout<<endl<<endl;

strcpy(nume_prenume,"Anatolie Dancu");
strcpy(functie,"Constructor");
salariu=8000;
procent=6;
suma_vanzari=29457;
CommissionWorker c(nume_prenume, functie, salariu, procent, suma_vanzari);
Worker *p3=&c;
c.afis();
p3->calcularea_salariului();
cout<<endl;

return 0;
}

Executarea programului:

Concluzii: În urma efectuarăă acesei lucrări de laborator am învățat ce este o funcție virtuală
și o clasa abstractă. De asemenea, am înțeles că în clasele abstracte comportamentul clasei
părinte se modifică pentru moştenitor.

S-ar putea să vă placă și