Sunteți pe pagina 1din 13

Programare Obiect-Orientat

Laborator V
Adrian Li / Ovidiu Grigore
2015

Scopul laboratorului

n Laboratorul V al materiei Programare Obiect-Orientat se studiaz detaliile


mecanismului de motenire ntre clase, polimorfism, funcii virtuale i abstractizare.
n acest laborator se parcurg urmtoarele puncte:
polimorfism
funcii virtuale
funcii pur virtuale
abstractizare
interfee

Desfurarea lucrrii

Pornind de la programul din lucrarea anterioar, unde aveam definit o clas


de baz Poligon i la clasa derivat Patrat, vom implementa i clasa derivat
numit Triunghi.
1
2
3
4
5
6
7
8
9
10
11
12

c l a s s Poligon
{
protected :
i n t nr_lat ;
double lungimi ;
public :
Poligon ()
{
c o u t << " P o l i g o n ( ) " << e n d l ;
t h i s >n r _ l a t = 0 ;
t h i s >l u n g i m i = NULL;
}

13
14
15

Poligon ( i n t nr_lat )
{

c o u t << " P o l i g o n ( i n t n r _ l a t ) " << e n d l ;


t h i s >n r _ l a t = n r _ l a t ;
t h i s >l u n g i m i = new d o u b l e [ n r _ l a t ] ;
i f ( t h i s >l u n g i m i == NULL)
{
c o u t << " E r o a r e l a a l o c a r e " << e n d l ;
exit (0) ;
}

16
17
18
19
20
21
22
23

24
25

~Poligon ( )
{
c o u t << "~ P o l i g o n ( ) " << e n d l ;
i f ( t h i s >l u n g i m i != NULL)
d e l e t e [ ] t h i s >l u n g i m i ;
t h i s >l u n g i m i = NULL;
}

26
27
28
29
30
31
32
33

d o u b l e& o p e r a t o r [ ] ( i n t i n d e x )
{
d o u b l e aux ;

34
35
36
37

i f ( i n d e x < t h i s >n r _ l a t )
return lungimi [ index ] ;
else
{
c o u t << " Latura " << i n d e x << " nu e x i s t a ! " << e n d l ;
r e t u r n aux ;
}

38
39
40
41
42
43
44

45
46

d o u b l e perim ( )
{
c o u t << " P e r i m e t r u d i n P o l i g o n " << e n d l ;

47
48
49
50

double r e z u l t a t = 0 ;
f o r ( i n t i = 0 ; i < t h i s >n r _ l a t ; i ++)
r e z u l t a t += t h i s >l u n g i m i [ i ] ;
return rezultat ;

51
52
53
54

55
56

f r i e n d o st re am& o p e r a t o r <<(o st re am& out , P o l i g o n& X) ;

57
58

};

59
60
61
62
63
64

o str ea m& o p e r a t o r <<(o st re am& out , P o l i g o n& X)


{
out << " P o l i g o n cu " << X. n r _ l a t << " l a t u r i de l u n g i m i : " ;
f o r ( i n t i = 0 ; i < X. n r _ l a t ; i ++)
out << X[ i ] << " " ;

65

r e t u r n out ;

66
67

68
69
70
71
72

c l a s s Patrat : public Poligon


{
public :

Patrat ( ) : Poligon (4)


{
f o r ( i n t i = 0 ; i < 4 ; i ++)
t h i s >l u n g i m i [ i ] = 0 ;
}

73
74
75
76
77
78

Patrat ( double l a t u r a ) : Poligon (4)


{
f o r ( i n t i = 0 ; i < 4 ; i ++)
t h i s >l u n g i m i [ i ] = l a t u r a ;
}

79
80
81
82
83
84

~Patrat ( )
{
c o u t << "~ P a t r a t ( ) " << e n d l ;
}

85
86
87
88
89

d o u b l e perim ( )
{
c o u t << " P e r i m e t r u d i n P a t r a t " << e n d l ;

90
91
92
93

r e t u r n 4 t h i s >l u n g i m i [ 0 ] ;

94

95
96

};

97
98
99
100
101
102
103
104
105
106
107

c l a s s Triunghi : public Poligon


{
public :
Triunghi ( double a , double b , double c ) : Poligon (3)
{
c o u t << " T r i u n g h i ( a , b , c ) " << e n d l ;
t h i s >l u n g i m i [ 0 ] = a ;
t h i s >l u n g i m i [ 1 ] = b ;
t h i s >l u n g i m i [ 2 ] = c ;
}

108
109
110
111
112

~Triunghi ( )
{
c o u t << "~ T r i u n g h i ( ) " << e n d l ;
}

113
114
115
116
117
118

bool este_dreptunghic ()
{
double l a t [ 3 ] ;
f o r ( i n t i = 0 ; i < 3 ; i ++)
l a t [ i ] = t h i s >l u n g i m i [ i ] ;

119
120
121
122
123
124
125
126
127

f o r ( i n t i = 0 ; i < 3 ; i ++)
f o r ( i n t j = i ; i < 3 ; i ++)
if ( lat [ j ] < lat [ i ])
{
d o u b l e aux = l a t [ j ] ;
lat [ j ] = lat [ i ] ;
l a t [ i ] = aux ;
}

128
129

if

( ( l a t [ 0 ] l a t [ 0 ] ) == ( l a t [ 1 ] l a t [ 1 ] ) + ( l a t [ 2 ] l a t [ 2 ] ) )

return true ;
else
return f a l s e ;

130
131
132

133
134

};

Clasa Triunghi motenete toi membrii clasei Poligon i implementeaz nc


o funcie care determin dac triunghiul este dreptunghic sau nu, dup formula
lui Pitagora: bool este_dreptunghic().

2.1

Polimorfism

Polimorfismul este proprietatea unui pointer la o clas derivat s fie compatibil


cu un pointer al clasei de baz. S presupunem exemplul urmtor:
1
2
3
4
5
6
7

P o l i g o n A = new P o l i g o n ( 5 ) ;
f o r ( i n t i = 0 ; i < 5 ; i ++)
( A) [ i ] = 1 0 ;
c o u t << A << e n d l ;
c o u t << A << e n d l ;
c o u t << A>perim ( ) << e n d l ;
d e l e t e A;

8
9
10
11

P a t r a t B = new P a t r a t ( 3 ) ;
c o u t << B>perim ( ) << e n d l ;
d e l e t e B;

12
13
14
15

16

T r i u n g h i C = new T r i u n g h i ( 3 , 4 , 5 ) ;
c o u t << C>perim ( ) << e n d l ;
c o u t << " T r i u n g h i u l e s t e d r e p t u n g h i c ? " << C>e s t e _ d r e p t u n g h i c ( )
<< e n d l ;
d e l e t e C;

Rezultatul rulrii codului este urmtorul:


1
2
3
4
5
6

Poligon ( i n t nr_lat )
004A6F68
P o l i g o n cu 5 l a t u r i de l u n g i m i : 10 10 10 10 10
Perimetru din Poligon
50
~Poligon ( )

7
8
9
10
11
12

Poligon ( i n t nr_lat )
Perimetru din Patrat
12
~Patrat ( )
~Poligon ( )

13
14
15
16
17
18
19
20

Poligon ( i n t nr_lat )
Triunghi (a , b , c )
Perimetru din Poligon
12
Triunghiul este dreptunghic ? 1
~Triunghi ( )
~Poligon ( )

La linia 1 din cod se creaz un obiect de tip Poligon cu 5 laturi, care se


iniializeaz fiecare cu 10 (liniile 2 i 3). La linia 4 se afieaz variabila A, care
este un pointer. Rezultatul este pe msur, afindu-ne o adres de memorie
i nimic altceva. La linia 5 afim valoarea pointerului A, adic afim obiectul
n sine. Deoarece avem suprancrcat operatorul , acesta va fi rulat i avem
rezultatul din consol de la linia 3. n continuare afim perimetrul acestui
poligon, apelnd funcia perim(). Aceast funcie ne arat c a fost apelat la
linia 4 din consol, urmnd ca la linia 5 s gsim rezultatul. tergnd obiectul
din memorie prin delete, observm c se ruleaz destructorul clasei Poligon.
Not. Am afiat pointerul A doar pentru a ne asigura c acolo se gsete un
pointer, nu un obiect. Obiectul se gsete efectiv la adresa afiat de ctre
pointer.
Continund cu linia 9 de cod, declarm un pointer la clasa Patrat i
creem un obiect de tip Patrat. Apelnd, la linia 10 funcia perim(), observm
n consol (linia 9 i 10) c se apeleaz funcia perim() din clasa Patrat, cum
era de ateptat, deoarece aceast funcie dei exista i pentru clasa de baz, era
definit i n clasa derivat Patrat.
Apelnd aceeai funcie pentru un obiect din clasa derivat Triunghi (care nu
are declarat funcia perim()) programul o va folosi pe cea din clasa de baz
Poligon. Observm c rezultatul este cel ateptat (liniile 16 i 17 din consol).
Not. De asemenea, observm c n cazurile claselor derivate Patrat i Triunghi, se apeleaz destructorii acestora, dup care destructorul clasei de baz,
cum era de ateptat.
n continuare, apelm urmtorul cod:
1
2
3

P o l i g o n B = new P a t r a t ( 3 ) ;
c o u t << B>perim ( ) << e n d l ;
d e l e t e B;

Pn discutm ieirea acestui cod, uitndu-ne la prima linie, observm c B


este un pointer la Poligon. n acest pointer alocm dinamic un obiect de
tip Patrat. Aceasta este proprietatea de polimorfism din C++: sintaxa este
corect, deoarece B ine minte adrese de obiecte Poligon, iar Patrat-ul este i el
un Poligon (derivat).
1
2
3
4

Poligon ( i n t nr_lat )
Perimetru din Poligon
12
~Poligon ( )

Primele dou linii din consol sunt rezultatul primei linii de cod: se creaz
obiectul. Partea cu adevrat interesant se gsete la linia 2 din cod: rulm
funcia perim(), funcie care este implementat ntr-un fel n clasa Poligon
i altfel n clasa Patrat. Din consol (liniile 2 i 3) putem trage concluzia
c funcia rulat a fost cea din clasa de baz. Acest lucru se ntmpl din
urmtoarea cauz:
1. Pointerul B este un pointer la Poligon.
5

2. n el memorm adresa unui Patrat.


3. Dar, n continuare, B este un pointer la Poligon. Practic, chiar dac n
el avem un Patrat, programul l trateaz ca pe un Poligon, fiindc asta
i spune tipul pointerului (i bineneles, pentru c ptratul este practic
un poligon).
Not. Foarte important: remarcai c n momentul distrugerii (linia 3 de cod),
dei n Patrat avea implementat un destructor, acesta NU a fost apelat, deoarece pointerul B se refer la un Poligon i gsete un destructor acolo. Dei
n acest exemplu nu este o problem (constructorul Patrat nu aloc memorie
n plus), de obicei pot aprea ulte erori de memorie dac nu suntem
ateni la acest aspect! Pentru a corecta aceast problem, vom folosi funcii
virtuale n subcapitolul 2.3.

2.2

Funcii virtuale

Transformarea unei funcii din clasa de baz ntr-o funcie virtual spune compilatorului s caute funcia i n clasa derivat. Dac funcia este gsit n clasa
derivat, atunci o apeleaz. Dac funcia nu este redefinit n clasa derivat, o
va folosi pe cea din clasa de baz. Pentru a transforma o funcie ntr-o funcie
virtual se adaug n faa acesteia cuvntul cheie virtual.
1
2
3
4
5
6
7
8
9
10
11
12

c l a s s Poligon
{
protected :
i n t nr_lat ;
double lungimi ;
public :
Poligon ()
{
c o u t << " P o l i g o n ( ) " << e n d l ;
t h i s >n r _ l a t = 0 ;
t h i s >l u n g i m i = NULL;
}

13
14
15
16
17
18
19
20
21
22
23
24

Poligon ( i n t nr_lat )
{
c o u t << " P o l i g o n ( i n t n r _ l a t ) " << e n d l ;
t h i s >n r _ l a t = n r _ l a t ;
t h i s >l u n g i m i = new d o u b l e [ n r _ l a t ] ;
i f ( t h i s >l u n g i m i == NULL)
{
c o u t << " E r o a r e l a a l o c a r e " << e n d l ;
exit (0) ;
}
}

25
26
27
28
29
30
31

~Poligon ( )
{
c o u t << "~ P o l i g o n ( ) " << e n d l ;
i f ( t h i s >l u n g i m i != NULL)
d e l e t e [ ] t h i s >l u n g i m i ;
t h i s >l u n g i m i = NULL;

32
33

d o u b l e& o p e r a t o r [ ] ( i n t i n d e x )
{
d o u b l e aux ;

34
35
36
37

i f ( i n d e x < t h i s >n r _ l a t )
return lungimi [ index ] ;
else
{
c o u t << " Latura " << i n d e x << " nu e x i s t a ! " << e n d l ;
r e t u r n aux ;
}

38
39
40
41
42
43
44

45
46

v i r t u a l d o u b l e perim ( )
{
c o u t << " P e r i m e t r u d i n P o l i g o n " << e n d l ;

47
48
49
50

double r e z u l t a t = 0 ;
f o r ( i n t i = 0 ; i < t h i s >n r _ l a t ; i ++)
r e z u l t a t += t h i s >l u n g i m i [ i ] ;
return rezultat ;

51
52
53
54

55
56

f r i e n d o st re am& o p e r a t o r <<(o st re am& out , P o l i g o n& X) ;

57
58

};

59
60
61
62
63
64

o str ea m& o p e r a t o r <<(o st re am& out , P o l i g o n& X)


{
out << " P o l i g o n cu " << X. n r _ l a t << " l a t u r i de l u n g i m i : " ;
f o r ( i n t i = 0 ; i < X. n r _ l a t ; i ++)
out << X[ i ] << " " ;

65

r e t u r n out ;

66
67

Practic, n programul de mai sus singura modificare o reprezint transformarea


funciei perim() a clasei de baz Poligon ntr-o funcie virtual (linia 47).
Restul claselor (Triunghi i Patrat) au ramas neschimbate. Rulnd acelai cod
pe care l-am rulat mai sus:
1
2
3

P o l i g o n B = new P a t r a t ( 3 ) ;
c o u t << B>perim ( ) << e n d l ;
d e l e t e B;

Rezultatul obinut este urmtorul:


1
2
3
4

Poligon ( i n t nr_lat )
Perimetru din Patrat
12
~Poligon ( )

Se poate observa diferena: dei B este un pointer la Poligon, n care am


construit un obiect de tip Patrat, apelnd funcia perim() de aceast dat se
apeleaz funcia de la Patrat. Acest lucru se ntmpl n urmtorul mod:
1. Pointerul B este un pointer la Poligon.
7

2. n el memorm adresa unui Patrat.


3. n continuare, B este un pointer la Poligon. Practic, chiar dac n el
avem un Patrat, programul l trateaz ca pe un Poligon, fiindc asta i
spune tipul pointerului (i bineneles, pentru c ptratul este practic
un poligon).
4. n momentul apelrii funciei perim(), compilatorul se uit prima dat
la funcia perim() de la Poligon i vede c aceasta este virtual.
5. Abia n acest moment compilatorul caut funcia la Patrat, i pentru c
o gsete, o apeleaz pe aceasta.
Analog, pentru urmtorul cod:
1
2
3

P o l i g o n B = new T r i u n g h i ( 3 , 4 , 5 ) ;
c o u t << B>perim ( ) << e n d l ;
d e l e t e B;

Deoarece clasa Triunghi nu redefinete funcia perim(), compilatorul ia decizia


n felul urmtor:
1. Pointerul B este un pointer la Poligon.
2. n el memorm adresa unui Triunghi.
3. n continuare, B este un pointer la Poligon. Practic, chiar dac n el
avem un Triunghi, programul l trateaz ca pe un Poligon, fiindc asta i
spune tipul pointerului (i bineneles, pentru c triunghiul este practic
un poligon).
4. n momentul apelrii funciei perim(), compilatorul se uit prima dat
la funcia perim() de la Poligon i vede c aceasta este virtual.
5. n acest moment compilatorul caut funcia la Triunghi, dar vede c
aceasta nu este definit
6. Rezultatul final este c va fi apelat funcia perim() de la Poligon.
Not. Toate funciile se pot virtualiza, cu excepia constructorilor.

2.3

Destructorul virtual

Transformarea destructorului n destructor virtual face posibil apelarea destructorului unui obiect prin pointerul clasei de baz. Acest lucru este foarte
util, prevenind programarea defectuas ce nu dezaloc memoria utilizat. Totui, dac la o funcie normal virtualizarea acesteia fcea compilatorul s execute doar funcia din clasa derivat, virtualizarea destructorului permite rularea
tuturor destructorilor, n ordine logic (de la cel mai derivat pn la cel de baz).
Not. n general, cnd lucrm cu clase derivate este bine ca destructorul s
fie, pe ct posibil, ntotdeauna virtual pentru fiecare clas implementat (chiar
dac este de baz sau derivat).
8

2.4

Funcii pur virtuale/Abstractizare

Pentru a putea nelege necesitatea funciilor pur virtuale, considerm urmtorul exemplu: clasei Poligon vrem s-i implementm o funcie care calculeaz
aria poligonului respectiv, n acelai mod cum funcia perim() poate calcula
perimetrul oricrui poligon posibil. Acest lucru este foarte greu, chiar imposibil
deoarece nu exist o formul general. Din acest motiv, pentru a ne asigura c
fiecrei clase derivate i se va implementa funcia double arie(), vom declara
n clasa de baz funcia arie ca fiind funcie pur virtual:
1
2
3
4
5
6
7
8
9
10
11

c l a s s Poligon
{
protected :
i n t nr_lat ;
double lungimi ;
public :
Poligon ()
{
t h i s >n r _ l a t = 0 ;
t h i s >l u n g i m i = NULL;
}

12
13
14
15
16
17
18
19
20
21
22

Poligon ( i n t nr_lat )
{
t h i s >n r _ l a t = n r _ l a t ;
t h i s >l u n g i m i = new d o u b l e [ n r _ l a t ] ;
i f ( t h i s >l u n g i m i == NULL)
{
c o u t << " E r o a r e l a a l o c a r e " << e n d l ;
exit (0) ;
}
}

23
24
25
26
27
28
29

v i r t u a l ~Poligon ( )
{
i f ( t h i s >l u n g i m i != NULL)
d e l e t e [ ] t h i s >l u n g i m i ;
t h i s >l u n g i m i = NULL;
}

30
31
32
33

d o u b l e& o p e r a t o r [ ] ( i n t i n d e x )
{
d o u b l e aux ;

34

i f ( i n d e x < t h i s >n r _ l a t )
return lungimi [ index ] ;
else
{
c o u t << " Latura " << i n d e x << " nu e x i s t a ! " << e n d l ;
r e t u r n aux ;
}

35
36
37
38
39
40
41
42

43
44
45
46

d o u b l e perim ( )
{
double r e z u l t a t = 0 ;

f o r ( i n t i = 0 ; i < t h i s >n r _ l a t ; i ++)


r e z u l t a t += t h i s >l u n g i m i [ i ] ;
return rezultat ;

47
48
49

50
51

v i r t u a l double a r i a ( ) = 0 ;

52
53

f r i e n d o st re am& o p e r a t o r <<(o st re am& out , P o l i g o n& X) ;

54
55

};

56
57
58
59
60
61

o str ea m& o p e r a t o r <<(o st re am& out , P o l i g o n& X)


{
out << " P o l i g o n cu " << X. n r _ l a t << " l a t u r i de l u n g i m i : " ;
f o r ( i n t i = 0 ; i < X. n r _ l a t ; i ++)
out << X[ i ] << " " ;

62

r e t u r n out ;

63
64

La linia 52 a fost declarat funcia pur virtual aria(). n acest moment,


clasa Poligon a devenit clas abstract. Asta nseamn c nu se mai pot crea
obiecte pure de tip Poligon. Funciile pur virtuale se monenesc.
Not. O clas abstract nu poate avea obiecte proprii, dar clase derivate din
aceasta, dac nu mai sunt abstracte, pot avea.
Ca o clas derivat s nu mai fie abstract aceasta trebuie s implementeze
TOATE funciile pur virtuale ale clasei de baz (inclusiv cele motenite de la
alte clase de baz, daca i clasa de baz era la rndul ei derivat din alte clase).
n exemplul nostru, nu vom mai putea creea obiecte de tip Poligon, dar dac
implementm funcia arie() pentru Patrat i Triunghi, atunci va fi posibil s
creem obiecte de tip Patrat/Triunghi.
Not. Polimorfismul nu este afectat de aceast proprietate a funciilor virtuale
de a abstractiza clasa.
Mai jos este prezentat programul complet din lucrarea curent:
1
2
3

#i n c l u d e <i o s t r e a m >
#i n c l u d e <math . h>
u s i n g namespace s t d ;

4
5
6
7
8
9
10
11
12
13
14
15

c l a s s Poligon
{
protected :
i n t nr_lat ;
double lungimi ;
public :
Poligon ()
{
t h i s >n r _ l a t = 0 ;
t h i s >l u n g i m i = NULL;
}

16
17
18

Poligon ( i n t nr_lat )
{

10

t h i s >n r _ l a t = n r _ l a t ;
t h i s >l u n g i m i = new d o u b l e [ n r _ l a t ] ;
i f ( t h i s >l u n g i m i == NULL)
{
c o u t << " E r o a r e l a a l o c a r e " << e n d l ;
exit (0) ;
}

19
20
21
22
23
24
25

26
27

v i r t u a l ~Poligon ( )
{
i f ( t h i s >l u n g i m i != NULL)
d e l e t e [ ] t h i s >l u n g i m i ;
t h i s >l u n g i m i = NULL;
}

28
29
30
31
32
33
34

d o u b l e& o p e r a t o r [ ] ( i n t i n d e x )
{
d o u b l e aux ;

35
36
37
38

i f ( i n d e x < t h i s >n r _ l a t )
return lungimi [ index ] ;
else
{
c o u t << " Latura " << i n d e x << " nu e x i s t a ! " << e n d l ;
r e t u r n aux ;
}

39
40
41
42
43
44
45

46
47

d o u b l e perim ( )
{
double r e z u l t a t = 0 ;
f o r ( i n t i = 0 ; i < t h i s >n r _ l a t ; i ++)
r e z u l t a t += t h i s >l u n g i m i [ i ] ;
return rezultat ;
}

48
49
50
51
52
53
54
55

v i r t u a l double a r i a ( ) = 0 ;

56
57

f r i e n d o st re am& o p e r a t o r <<(o st re am& out , P o l i g o n& X) ;

58
59

};

60
61
62
63
64
65

o str ea m& o p e r a t o r <<(o st re am& out , P o l i g o n& X)


{
out << " P o l i g o n cu " << X. n r _ l a t << " l a t u r i de l u n g i m i : " ;
f o r ( i n t i = 0 ; i < X. n r _ l a t ; i ++)
out << X[ i ] << " " ;

66

r e t u r n out ;

67
68

69
70
71
72
73
74
75

c l a s s Patrat : public Poligon


{
public :
Patrat ( ) : Poligon (4)
{

11

f o r ( i n t i = 0 ; i < 4 ; i ++)
t h i s >l u n g i m i [ i ] = 0 ;

76
77

78
79

Patrat ( double l a t u r a ) : Poligon (4)


{
f o r ( i n t i = 0 ; i < 4 ; i ++)
t h i s >l u n g i m i [ i ] = l a t u r a ;
}

80
81
82
83
84
85

~Patrat ( )
{

86
87
88

89
90

double a r i a ( )
{
r e t u r n ( t h i s >l u n g i m i [ 0 ] t h i s >l u n g i m i [ 0 ] ) ;
}

91
92
93
94
95

};

96
97
98
99
100
101
102
103
104
105

c l a s s Triunghi : public Poligon


{
public :
Triunghi ( double a , double b , double c ) : Poligon (3)
{
t h i s >l u n g i m i [ 0 ] = a ;
t h i s >l u n g i m i [ 1 ] = b ;
t h i s >l u n g i m i [ 2 ] = c ;
}

106
107
108

~Triunghi ( )
{

109
110

111
112
113
114
115
116

bool este_dreptunghic ()
{
double l a t [ 3 ] ;
f o r ( i n t i = 0 ; i < 3 ; i ++)
l a t [ i ] = t h i s >l u n g i m i [ i ] ;

117

f o r ( i n t i = 0 ; i < 3 ; i ++)
f o r ( i n t j = i ; i < 3 ; i ++)
if ( lat [ j ] < lat [ i ])
{
d o u b l e aux = l a t [ j ] ;
lat [ j ] = lat [ i ] ;
l a t [ i ] = aux ;
}

118
119
120
121
122
123
124
125
126

( ( l a t [ 0 ] l a t [ 0 ] ) == ( l a t [ 1 ] l a t [ 1 ] ) + ( l a t [ 2 ] l a t [ 2 ] ) )
return true ;
else
return f a l s e ;
if

127
128
129
130
131

132

12

double a r i a ( )
{
d o u b l e p = perim ( ) / 2 ;
r e t u r n s q r t ( p ( p t h i s >l u n g i m i [ 0 ] ) ( p t h i s >l u n g i m i [ 1 ] ) ( p
t h i s >l u n g i m i [ 2 ] ) ) ;
}

133
134
135
136

137
138

};

139
140
141
142

v o i d program ( )
{
P o l i g o n B = new P a t r a t ( 3 ) ;

143

c o u t << B << e n d l ;
c o u t << " Perim : " << B>perim ( ) << e n d l ;
c o u t << " A r i a : " << B>a r i a ( ) << e n d l ;
d e l e t e B;

144
145
146
147
148

T r i u n g h i T( 3 , 4 , 5 ) ;
c o u t << T << e n d l ;
c o u t << " Perim : " << T . perim ( ) << e n d l ;
c o u t << " A r i a : " << T . a r i a ( ) << e n d l ;
c o u t << " D r e p t u n g h i c ? " << T . e s t e _ d r e p t u n g h i c ( ) << e n d l ;

149
150
151
152
153
154

155
156
157
158

i n t main ( )
{
program ( ) ;

159

system ( " pause " ) ;


return 0;

160
161
162

2.5

Interfee

Interfeele sunt un concept de programare obiect-orientat foarte rspndit n


special n JAVA. O interfa este o clas-ablon, este o clas referin pentru
creearea altor clase. C++ nu ofer suport explicit pentru interfee, dar acestea
se pot modela folosind clasele abstracte. Practic n C++ o interfa este o clas
cu toate funciile sunt pur virtuale. Aceast clas este derivat n clasele ce se
doresc a fi create dup ablon.
Not. Clasa ce conine doar funcii pur virtuale este foarte uor de tras concluzia c este un ablon, deoarece nu las programatorul s uite de implementat
nicio funcie. n caz c o funcie nu este implementat, compilatorul va semnala
o eroare: clasa implementat este abstract i nu se pot crea obiecte de acest
tip.

Probleme
1. Pentru clasele din capitolul 2, creai un pointer la Poligon, i alocai dinamic un obiect de tip Triunghi. Folosind de funcia este_dreptunghic a
clasei Triunghi afiai dac trigunghiul respectiv este sau nu dreptunghic.
13

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