7/24/2019 curs7-POO2013.pdf
1/67
LECTOR ADRIAN RUNCEANU
Programare orientatpe obiecte
Universitatea Constantin Brncui din Trgu-Jiu
Facultatea de Inginerie
Departamentul de Automatic, Energie i Mediu
7/24/2019 curs7-POO2013.pdf
2/67
01.11.2013Curs - Programare orientat pe obiecte C++/Java
2
Curs 7Clase derivate. Motenire
7/24/2019 curs7-POO2013.pdf
3/67
Curs 7
01.11.2013Curs - Programare orientat pe obiecte C++/Java
3
1. Noiuni de bazcare privesc motenirea1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz1.2. Suprancrcarea funciilor
2. Accesul la membrii unei clase derivate3. Constructori i destructori n clasele
derivate4. Utilitatea claselor derivate
7/24/2019 curs7-POO2013.pdf
4/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
4
Prin motenire se nelege aceaproprietate a claselor prin care un tip
nou construit poate prelua datele imetodele unui tip mai vechi.
n C++ acest mecanism mai este
cunoscut sub numele derivareaclaselor.
7/24/2019 curs7-POO2013.pdf
5/67
01.11.2013Curs - Programare orientat pe obiecte C++/Java
5
Evident, clasei nou construite i se potadauga noi date si metode.
Prin acest procedeu se preia soft deja facut
care se dezvolta.Avantajul urias al acestui procedeu este
ca persoana care reia un anumit soft
trebuie sa cunoasca doar documentatia deutilizare a soft-ului preluat.
1. Noiuni de bazcare privescmotenirea
7/24/2019 curs7-POO2013.pdf
6/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
6
Ideea de baza este urmatoarea:Fiind date clasele C1, C2, ., Cn, putem
construi clasa Cn+1 care are, pe langa datele
si metodele claselor enumerate, date simetode proprii.
Clasele C1, C2, ., Cnse numesc clase de baz
Clasa Cn+1se numeste clasa derivat
7/24/2019 curs7-POO2013.pdf
7/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
7
Forma simplificata prin care o clasa seobtine din derivarea altei clase esteurmatoarea:
Semnificatia este: clasa C1 este derivata dinclasa de baza C, iar clasa C este clasa carese deriveaza.
class C1:public C{.}
7/24/2019 curs7-POO2013.pdf
8/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
8
Exemplul 1Clasa numar contine o data membru n, si o
metoda membru tip().
Clasa numar_d este derivata din clasanumar.
Prin urmare, un obiect obtinut prininstantierea acesteia, are data membru nsi metoda
tipar().Pe langa aceasta, clasa numar_d are o noua
metoda numita citire().
7/24/2019 curs7-POO2013.pdf
9/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
9
#includeclass numar{
public:int n;void tipar() { cout
7/24/2019 curs7-POO2013.pdf
10/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
10
class numar_d : public numar{public:
void citire()
{coutn;
}};
7/24/2019 curs7-POO2013.pdf
11/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
11
int main(void){
numar_d a;
a.citire();a.tipar();
}
7/24/2019 curs7-POO2013.pdf
12/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
12
Dupa executia programului se obtin urmatoarelerezultate:
7/24/2019 curs7-POO2013.pdf
13/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
13
Exemplul 2Clasa complexne permite sa lucram usor cu
numere complexe.In timpul utilizarii acestei clase am observat
ca ar fi bine sa contina o metoda booleananumita real(), care sa ne permita sa testamdaca numarul complex este real sau nu.
Dispunem de documentatia clasei complex.Vom defini o noua clasa numita complex_d
care sa contina datele si metodele clasei complexsi, in plus, sa contina si o noua metoda.
7/24/2019 curs7-POO2013.pdf
14/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
14
#include#include "complex.cpp // fisier in care este
declarata si definita clasa complex
class complex_d : public complex{public:
int parte_reala();};
7/24/2019 curs7-POO2013.pdf
15/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
15
int complex_d::parte_reala(){
return imag==0;
}
7/24/2019 curs7-POO2013.pdf
16/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
16
int main(void){
complex_d z;
z.real = 3;z.imag = 1;if(z.parte_reala())
cout
7/24/2019 curs7-POO2013.pdf
17/67
1. Noiuni de bazcare privescmotenirea
01.11.2013Curs - Programare orientat pe obiecte C++/Java
17
Clasa complex seinclude in aceasta
zona NOTA: Clasa
complex nucontine functiamain()!!!!!!!!
7/24/2019 curs7-POO2013.pdf
18/67
Curs 7
01.11.2013Curs - Programare orientat pe obiecte C++/Java
18
1. Noiuni de bazcare privesc motenirea1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz1.2. Suprancrcarea funciilor
2. Accesul la membrii unei clase derivate3. Constructori i destructori n clasele
derivate4. Utilitatea claselor derivate
7/24/2019 curs7-POO2013.pdf
19/67
1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
01.11.2013Curs - Programare orientat pe obiecte C++/Java
19
Unui obiect al clasei de baza i se poate atribui unobiect al unei clase care este derivata din ea.
Unui obiect al unei clase derivate nu i se poate
atribui un obiect al clasei de baza.
De ce?Pentru ca in clasa derivata avem date si
metode in plus fata de clasa de baza! si nu putemsti ce valori vor primi acestea in cazul unei astfelde atribuiri.
7/24/2019 curs7-POO2013.pdf
20/67
1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
01.11.2013Curs - Programare orientat pe obiecte C++/Java
20
Putem totui suprancrca operatorul=n clasa derivat.
Dar i aici datele care aparin exclusivclasei derivate vor lua valori arbitrare(n exemplul urmtor valoarea 0).
7/24/2019 curs7-POO2013.pdf
21/67
1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
01.11.2013Curs - Programare orientat pe obiecte C++/Java
21
Exemplul 3
#include
class numar{public:
int m; // informatie specifica clasei de baza
};
7/24/2019 curs7-POO2013.pdf
22/67
1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
01.11.2013Curs - Programare orientat pe obiecte C++/Java
22
class numar_d : public numar{public:
int n; // informatie specifica clasei derivate
void operator=(numar &x){
m=x.m;
n=0;}
};
7/24/2019 curs7-POO2013.pdf
23/67
1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
01.11.2013Curs - Programare orientat pe obiecte C++/Java
23
int main(void){
numar a;numar_d b;
b.m=3;b.n=4;a=b;
cout
7/24/2019 curs7-POO2013.pdf
24/67
1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
01.11.2013Curs - Programare orientat pe obiecte C++/Java
24
Dupa executia programului se obtin urmatoarelerezultate:
7/24/2019 curs7-POO2013.pdf
25/67
Curs 7
01.11.2013Curs - Programare orientat pe obiecte C++/Java
25
1. Noiuni de bazcare privesc motenirea1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
1.2. Suprancrcarea funciilor2. Accesul la membrii unei clase derivate3. Constructori i destructori n clasele
derivate4. Utilitatea claselor derivate
7/24/2019 curs7-POO2013.pdf
26/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
26
Se stie ca functiile pot fisupraincarcate.
Dar o clasa derivata poate contine ofunctie cu acelasi nume si cu aceeasi
lista de parametrii formali ca una aclasei de baza?
Raspunsul este afirmativ.
7/24/2019 curs7-POO2013.pdf
27/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
27
In exemplul urmator:
clasa de baza numar are o metoda numita
tipar(), in care lista parametrilor este vida clasa derivata numar_d are pe langa
metoda tipar(), mostenita, o alta metoda
numita tot tipar(), tot cu lista parametrilorvida
7/24/2019 curs7-POO2013.pdf
28/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
28
Prin a.tipar()se apeleaza metoda tipar()proprie clasei derivate.
In cazul in care dorim sa apelam metodatipar() a clasei de baza scriem:a.numar::tipar().
Cele doua metode cu acelasi nume difera
doar prin mesajul afisat inaintea tipaririivalorii retinute de variabila.
7/24/2019 curs7-POO2013.pdf
29/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
29
Exemplul 4
#includeclass numar{
public:int i;
void tipar(){
cout
7/24/2019 curs7-POO2013.pdf
30/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
30
class numar_d : public numar{public:void tipar(){
cout
7/24/2019 curs7-POO2013.pdf
31/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
31
int main(void){
numar_d a;
a.i = 3;a.tipar();a.numar::tipar();
}
7/24/2019 curs7-POO2013.pdf
32/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
32
Dupa executia programului se obtin urmatoarelerezultate:
7/24/2019 curs7-POO2013.pdf
33/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
33
Mai exist situaia n care, n clasa derivat sdefinim o dat membru cu acelai nume cu odatdin clasa de baz.
Nu se semnaleazeroare n acest caz. Iar un obiect rezultat ca o instaniere a unei clase
derivate va avea doudate cu acelai nume.
Implicit se adreseaz data definit n clasaderivat, dar este posibil sadresm i data dinclasa de bazla fel ca i n cazul funciilor.
7/24/2019 curs7-POO2013.pdf
34/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
34
Exemplul 5
#includeclass numar{
public:int i;};class numar_d : public numar{
public:int i;
};
7/24/2019 curs7-POO2013.pdf
35/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
35
int main(void){
numar_d a;
a.i=2;a.numar::i=3;cout
7/24/2019 curs7-POO2013.pdf
36/67
1.2. Suprancrcarea funciilor
01.11.2013Curs - Programare orientat pe obiecte C++/Java
36
Dupa executia programului se obtin urmatoarelerezultate:
7/24/2019 curs7-POO2013.pdf
37/67
Curs 7
01.11.2013Curs - Programare orientat pe obiecte C++/Java
37
1. Noiuni de bazcare privesc motenirea1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
1.2. Suprancrcarea funciilor2. Accesul la membrii unei clase derivate3. Constructori i destructori n clasele
derivate4. Utilitatea claselor derivate
2 Accesul la membrii unei clase
7/24/2019 curs7-POO2013.pdf
38/67
2. Accesul la membrii unei clasederivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
38
Membrii unei clase (date si metode) sunt de treifeluri:
Publiciprecedati de cuvantul cheie public:Acestia
pot fi accesati din exteriorul clasei.Privatiprecedati de cuvantul cheie private:
Stim ca, implicit membrii unei clase sunt privati.Membriiprivateai unei clase nu pot fi accesati din
exteriorul clasei, decat din interiorul clasei respective.
A l l b ii i l
7/24/2019 curs7-POO2013.pdf
39/67
2. Accesul la membrii unei clasederivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
39
Protejati precedati de cuvantul cheieprotected:
Pana acum nu am folosit acest tip de membri.
Rolul lor apare in momentul in care clasaeste derivata.
Ei nu pot si accesati din exterior (la fel ca simembrii privati), dar pot fi accesati din clasele
derivate.
A l l b ii i l
7/24/2019 curs7-POO2013.pdf
40/67
2. Accesul la membrii unei clasederivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
40
Exista trei modalitati in care o clasa poate fi mostenita(derivata): 1. class numar_d:publicnumar
{
. . .
};
2. class numar_d:privatenumar
{
. . .
};
3. class numar_d:protectednumar{
. . .
};
A l l b ii i l
7/24/2019 curs7-POO2013.pdf
41/67
2. Accesul la membrii unei clasederivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
41
1. A fost mostenita clasa precedata decuvantul cheiepublic:
- membrii publici ai clasei de baza raman
publicsi in clasa derivata- membrii privati ai clasei de baza ramanprivatesi in clasa derivata
- membrii protejati ai clasei de baza ramanprotectedsi in clasa derivata
2 Accesul la membrii unei clase
7/24/2019 curs7-POO2013.pdf
42/67
2. Accesul la membrii unei clasederivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
42
2. A fost mostenita precedata de cuvantulcheieprivate:
In aceasta situatie clasa derivata are totimembrii private.
In schimb, in interiorul clasei derivate
putem accesa membrii publici si membriiprotejati ai clasei de baza.
2 A l l b ii i l
7/24/2019 curs7-POO2013.pdf
43/67
2. Accesul la membrii unei clasederivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
43
3. A fost mostenita precedata de cuvantul cheieprotected:
In aceasta situatie, membrii public siprotected ai clasei de baza sunt protejatipentru noua clasa, iar cei privateai clasei debaza raman privatesi pentru clasa derivata Din interiorul clasei derivate putem accesa
membrii publicsi privateai clasei de baza
2 A l l b ii i l
7/24/2019 curs7-POO2013.pdf
44/67
2. Accesul la membrii unei clasederivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
44
Forma generala a unei clase derivate:class nume
: [publicsauprivatesauprotected]nume_1,
: [publicsauprivatesauprotected]nume_2,. . .
: [publicsauprivatesauprotected]
nume_n{. . .
};
7/24/2019 curs7-POO2013.pdf
45/67
Curs 7
01.11.2013Curs - Programare orientat pe obiecte C++/Java
45
1. Noiuni de bazcare privesc motenirea1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
1.2. Suprancrcarea funciilor2. Accesul la membrii unei clase derivate3. Constructori i destructori n clasele
derivate
4. Utilitatea claselor derivate
7/24/2019 curs7-POO2013.pdf
46/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
46
n cazul n care definim o clas derivat aunei clase de baz, constructorii i destructoriiau un comportament specific.
Exemplul 6Clasa numar_dmosteneste clasa numar.Fiecare dintre ele este inzestrata cu unconstructor.Cei doi constructori difera doar prin sirul afisat.La declararea unui obiect care instantiaza clasaderivata se tipareste numarapoi numar_d.
7/24/2019 curs7-POO2013.pdf
47/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
47
#include
class numar{public:
numar(){ cout
7/24/2019 curs7-POO2013.pdf
48/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
48
class numar_d : public numar{public:
numar_d()
{ cout
7/24/2019 curs7-POO2013.pdf
49/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
49
Dupa executia programului se obtin urmatoarelerezultate:
Astfel se observa ca la declareaunui obiect se apeleleaza mai intaiconstructorul clasei de baza si apoicel al clasei derivate.
7/24/2019 curs7-POO2013.pdf
50/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
50
Lucrurile se complica atunci cand inclasa de baza avem mai multi constructori, iar
in clasa derivata, la fel, alti constructorispecifici clasei respective.
7/24/2019 curs7-POO2013.pdf
51/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
51
Exemplul 7
#include
class numar{public:
numar()
{ cout
7/24/2019 curs7-POO2013.pdf
52/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
52
class numar_d : public numar{
public:numar_d(){ cout
7/24/2019 curs7-POO2013.pdf
53/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
53
int main(void){
numar_d a, b(1);}
i i d i
7/24/2019 curs7-POO2013.pdf
54/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
54
Dupa executia programului se obtin urmatoarelerezultate:
i i d i
7/24/2019 curs7-POO2013.pdf
55/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
55
Un constructor al clasei derivate, mai intaiapeleaza constructorul fara parametri alclasei de baza, apoi efectueaza propriile
operatii.
Apelul constructorului clasei de baza se face
automat, fara ca programatorul sa scrieceva.
i i d i
7/24/2019 curs7-POO2013.pdf
56/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
56
In cazul in care acesta doreste sa fieapelat un anumit constructor, altul decat celfara parametri, se procedeaza ca in exemplul
precedent, unde constructorul cu unparametru al clasei derivate apeleaza pe cel cuun parametru al clasei de baza:
numar_d (int k) : numar (k){ cout
7/24/2019 curs7-POO2013.pdf
57/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
57
In ceea ce priveste destructorii,acestia se apeleaza in ordinea inversa incare au fost apelati constructorii.
C i i d i
7/24/2019 curs7-POO2013.pdf
58/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
58
Exemplul 8#includeclass numar{
public:numar(){ cout
7/24/2019 curs7-POO2013.pdf
59/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
59
class numar_d : public numar{public:
numar_d(){ cout
7/24/2019 curs7-POO2013.pdf
60/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
60
int main(void){
numar_d b;}
C i i d i
7/24/2019 curs7-POO2013.pdf
61/67
3. Constructori i destructori
01.11.2013Curs - Programare orientat pe obiecte C++/Java
61
Dupa executia programului se obtin urmatoarelerezultate:
C
7/24/2019 curs7-POO2013.pdf
62/67
Curs 7
01.11.2013Curs - Programare orientat pe obiecte C++/Java
62
1. Noiuni de bazcare privesc motenirea1.1. Atribuiri ntre obiectele unei clasederivate i obiectele clasei de baz
1.2. Suprancrcarea funciilor2. Accesul la membrii unei clase derivate3. Constructori i destructori n clasele
derivate
4. Utilitatea claselor derivate
Utilit t l l d i t
7/24/2019 curs7-POO2013.pdf
63/67
4. Utilitatea claselor derivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
63
Scopul claselor derivate este de a adauganoi caracteristici unei clase de baza.
In general, clasele derivate au nevoie deconstructori mai complecsi decat cei de la
baza; de aceea, pentru usurinta, se vor apelaimplicit constructorii clasei de baz de cteori este posibil.
Utilit t l l d i t
7/24/2019 curs7-POO2013.pdf
64/67
4. Utilitatea claselor derivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
64
Deoarece o clas derivat nu estedect o construcie n jurul unei clasede baz, regulile sunt urmtoarele:
1. pentru constructor, se apeleaz mai nticonstructorii clasei de baz i apoi seexecutaciunile specifice constructorului
clasei derivate2. pentru destructori, se procedeaz invers,
apelndu-se nti destructorul clasei
derivate i apoi cel al clasei de baz
Utilit t l l d i t
7/24/2019 curs7-POO2013.pdf
65/67
4. Utilitatea claselor derivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
65
De reinut: Daca toti constructorii sau destructorii unei
clase de baza sunt de tip private, atunci ei
nu pot fi accesati de clasa derivata, rezultando situatie grava, ce va fi semnalata ca eroarede compilare.
Deci, se recomanda ca destructorul si celputin un constructor al clasei de baza sa fiedeclarati de tippublic.
Utilit t l l d i t
7/24/2019 curs7-POO2013.pdf
66/67
4. Utilitatea claselor derivate
01.11.2013Curs - Programare orientat pe obiecte C++/Java
66
Constructorii si destructorii clasei debaza sunt folositi la crearea si
distrugerea obiectelor claselor derivate,dar ei nu sunt mosteniti de catre acestea.
7/24/2019 curs7-POO2013.pdf
67/67
67
ntrebri?
Top Related