Sunteți pe pagina 1din 19

Programare orientată pe

obiecte
C++
#7 Proprietati ale mecanismului de
mostenire

Adrian Runceanu
www.runceanu.ro/adrian
2016
copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


1. Transmiterea parametrilor în mecanismul de moştenire
Forma generală a declaraţiei constructorului este următoarea:
Derivata constructor(lista_argumente): baza1(lista_argumente1)
: baza2(lista_argumente2)
....
: bazaN(lista_argumenteN)
{
// corpul constructorului derivatei
}
În declaraţia precedentă, baza1 până la bazaN reprezintă clasele de
bază pentru clasa derivată, iar lista_argumente este formată din
lista_argumente1, ..., lista_argumenteN, plus argumentele necesare
constructorului clasei Derivata

23.11.2016 P.O.O. - limbajul C++ (laborator) 2


copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


2. Moştenirea pe mai multe niveluri

 Aşa cum s-a vazut moştenirea multiplă constă în


folosirea a două sau mai multe clase la bază pentru a
deriva o nouă clasă.

 Moştenirea pe mai multe nivele, are loc la derivarea


unei clase dintr-o clasă de bază care, la rândul ei este
derivată din altă clasă.

23.11.2016 P.O.O. - limbajul C++ (laborator) 3


copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


3. Conflictele de nume între clasele de bază şi cele
derivate

 Atunci când se derivează o nouă clasă din una sau mai


multe clase de bază, este posibil ca numele unui
membru din clasa derivată să fie identic cu numele unui
membru din una sau mai multe clase de bază. Atunci
când apare un astfel de conflict, C++ utilizează numele
membrului din clasa derivată

23.11.2016 P.O.O. - limbajul C++ (laborator) 4


copyright@www.adrian.runceanu.ro

Diagrama UML
1. Clasa Punct Punct
(#) double fi, teta, ro;
(+) double x,y,z;
(+) punct()
(+) punct (double fic, double tetac, double roc)
(+) ~punct()
(+) void cartezian()
(+) void afisare_coordonate_polare()
(+) void afisare_coordonate_carteziene()
friend class Segment

23.11.2016 P.O.O. - limbajul C++ (laborator) 5


copyright@www.adrian.runceanu.ro

Diagrama UML
2. Clasa Segment
Segment
(-) double d;
Punct P1;
Punct P2;
(+) segment(double f1, double teta1, double ro1, double
f2, double teta2, double ro2) : P1(fi1, teta1, ro1), P2(fi2,
teta2, ro2)
(+) ~segment()
(+) void distanta()
(+) void afisare_segment()
23.11.2016 P.O.O. - limbajul C++ (laborator) 6
copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


Problema nr. 1
1. Să se implementeze o clasă Punct care
conţine 6 date de tip privat:
- 3 reprezintă coordonatele polare ale punctului
în spaţiu (unghiurile, şi distanţa, aşa cum arată
figura următoare):

23.11.2016 P.O.O. - limbajul C++ (laborator) 7


copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


Problema nr. 1 (continuare)
iar 3 sunt coordonatele carteziene ale punctului
(x, y şi z).
Constructorul clasei va iniţializa cele trei
coordonate polare, iar clasa va avea o funcţie de
calcul a coordonatelor carteziene ştiind că
formulele de calcul sunt următoarele:
 x   cos   cos  

 y   cos  sin  
 z   sin  
23.11.2016

P.O.O. - limbajul C++ (laborator) 8
copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


Solutie:

#include <iostream>
#include<math.h>
using namespace std;

class Punct {
protected:
double fi, teta, ro;
double x, y, z;

public:
Punct() {x=0; y=0; z=0;};

23.11.2016 P.O.O. - limbajul C++ (laborator) 9


copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


Punct(double fic,double tetac,double roc) {
cout<<"\n s-a apelat constructorul clasei punct";
fi=fic;
teta=tetac;
ro=roc;
}

~Punct() {
cout<<"\n s-a apelat destructorul clasei punct";
}

23.11.2016 P.O.O. - limbajul C++ (laborator) 10


copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


void cartezian()
{
x=ro*cos(teta)*cos(fi);
y=ro*cos(teta)*sin(fi);
z=ro*sin(teta);
}

void afisare_coordonate_polare()
{
cout<<"\n fi="<<fi;
cout<<"\n teta="<<teta;
cout<<"\n ro="<<ro<<endl;
}
23.11.2016 P.O.O. - limbajul C++ (laborator) 11
copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7

void afisare_coordonate_carteziene()
{
cout<<"\n x="<<x;
cout<<"\n y="<<y;
cout<<"\n z="<<z<<endl;
}

friend class Segment;


}; // sfarsit definire clasa Punct

23.11.2016 P.O.O. - limbajul C++ (laborator) 12


copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


class Segment {
private:
double d;
Punct P1;
Punct P2;

public:
Segment(double fi1, double teta1, double ro1,
double fi2, double teta2, double ro2): P1(fi1, teta1, ro1),
P2(fi2, teta2, ro2)
{ cout<<"\n s-a apelat constructorul clasei
segment";
}
23.11.2016 P.O.O. - limbajul C++ (laborator) 13
copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


~Segment() {
cout<<"\n s-a apelat destructorul clasei segment";
}

void distanta()
{
P1.Cartezian();
P2.Cartezian();
d=sqrt(pow((P2.x-P1.x),2)+pow((P2.y-
P1.y),2)+pow((P2.z-P1.z),2));
}
23.11.2016 P.O.O. - limbajul C++ (laborator) 14
copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


void afisare_segment()
{
cout<<"\n capetele segmentului in coord. polare:";
cout<<"\n punctul P1:";
P1.afisare_coordonate_polare();
cout<<"\n punctul P2:";
P2.afisare_coordonate_polare();
cout<<"\n capetele segmentului in coord. carteziene:";
cout<<"\n punctul P1:";
P1.afisare_coordonate_carteziene();
cout<<"\n punctul P2:";
P2.afisare_coordonate_carteziene();
cout<<"\n lungimea segmentului este "<<d<<endl;
}
}; // sfarsit definire clasa
23.11.2016 Segment
P.O.O. - limbajul C++ (laborator) 15
copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


int main()
{
cout<<"\n primul segment:";
Segment s1(0,0,1,3.1416,0,1);
s1.distanta();
s1.afisare_segment();

cout<<"\n al doilea segment:";


Segment s2(0,3.1416,2,3.1416,0,3);
s2.distanta();
s2.afisare_segment();
return 0;
}
23.11.2016 P.O.O. - limbajul C++ (laborator) 16
copyright@www.adrian.runceanu.ro

23.11.2016 P.O.O. - limbajul C++ (laborator) 17


copyright@www.adrian.runceanu.ro

Lucrarea de laborator nr. 7


Problema propusa spre rezolvare

2. Să se implementeze o clasă Punct care să conţină două date


de tip privat x şi y ce reprezintă coordonatele carteziene în plan
ale unui punct, o funcţie constructor care iniţializează cele două
coordonate şi o funcţie de afişare a coordonatelor.
Să se creeze o clasă Triunghi de tip friend cu clasa Punct, care să
conţină trei elemente de tipul Punct ce reprezintă vârfurile unui
triunghi.
Să se creeze o funcţie care să stabilească dacă triunghiul este
echilateral, isoscel sau oarecare şi o funcţie care să calculeze
perimetrul triunghiului.

23.11.2016 P.O.O. - limbajul C++ (laborator) 18


copyright@www.adrian.runceanu.ro

“First, solve the problem. Then, write


the code.”

- John Johnson

23.11.2016 P.O.O. - limbajul C++ (laborator) 19

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