This shows you the differences between two versions of the page.
poo-is:laboratoare:06 [2020/09/29 22:27] alexandru.ionita99 |
poo-is:laboratoare:06 [2020/09/29 22:44] (current) alexandru.ionita99 [5.1. Diferente] |
||
---|---|---|---|
Line 6: | Line 6: | ||
- | ===== Introducere ===== | + | ===== 1. Introducere ===== |
<note important> | <note important> | ||
**Derivarea** este o relatie intre clase de tipul "is a" / "is many". | **Derivarea** este o relatie intre clase de tipul "is a" / "is many". | ||
Line 12: | Line 12: | ||
<note important> **Mostenirea** (numita si **derivare**) este un mecanism de refolosire a codului. Totodata, ofera posibilitatea de a defini o clasa care ,,extinde" o clasa existenta (la codul de baza din clasa existenta adaugandu-se noi atribute si/sau metode). </note> | <note important> **Mostenirea** (numita si **derivare**) este un mecanism de refolosire a codului. Totodata, ofera posibilitatea de a defini o clasa care ,,extinde" o clasa existenta (la codul de baza din clasa existenta adaugandu-se noi atribute si/sau metode). </note> | ||
- | ==== Exemplu ==== | + | ==== 1.1. Exemplu ==== |
<code c++> | <code c++> | ||
//cod | //cod | ||
Line 66: | Line 66: | ||
//cod | //cod | ||
</code> | </code> | ||
- | ==== Ce observam? ==== | + | ==== 1.2. Ce observam? ==== |
Putem observa ca avem o clasa de baza, **Produs**, si ca putem distinge mai multe categorii de produse. Aceste categorii de produse sunt niste clase care, pe langa faptul ca au comportamentul clasei Produs, au in plus atribute si comportamente specifice (**clase specializate**). | Putem observa ca avem o clasa de baza, **Produs**, si ca putem distinge mai multe categorii de produse. Aceste categorii de produse sunt niste clase care, pe langa faptul ca au comportamentul clasei Produs, au in plus atribute si comportamente specifice (**clase specializate**). | ||
Line 73: | Line 73: | ||
<note warning>**Problema intampinata:** Am __rescris__ foarte mult cod. Cum fac sa evit asta?</note> | <note warning>**Problema intampinata:** Am __rescris__ foarte mult cod. Cum fac sa evit asta?</note> | ||
- | ======= Derivarea ======= | + | ===== 2. Derivarea ===== |
- | === Aplicare === | + | ==== 2.1. Aplicare ==== |
<code c++> | <code c++> | ||
//cod | //cod | ||
Line 112: | Line 112: | ||
</code> | </code> | ||
<note tip>Am rezolvat problema intampinata!</note> | <note tip>Am rezolvat problema intampinata!</note> | ||
- | === Concluzie === | + | ==== 2.2. Concluzie ==== |
<note important>Acum putem afirma ca: | <note important>Acum putem afirma ca: | ||
Line 118: | Line 118: | ||
In clasa derivata sunt mostenite toate atributele si metodele clasei de baza si le pot accesa direct daca sunt declarate public sau protected.</note> | In clasa derivata sunt mostenite toate atributele si metodele clasei de baza si le pot accesa direct daca sunt declarate public sau protected.</note> | ||
- | === Intrebari === | + | ==== 2.3. Intrebari ==== |
- | ==1. Putem sa derivam mai multe clase din clasa de baza?== | + | **1. Putem sa derivam mai multe clase din clasa de baza?** |
Da, se poate face acest lucru. Putem sa avem oricate clase derivate dintr-o clasa de baza si oricate niveluri de derivare (**cat timp este logic**). | Da, se poate face acest lucru. Putem sa avem oricate clase derivate dintr-o clasa de baza si oricate niveluri de derivare (**cat timp este logic**). | ||
- | ==2. Pot sa am mai multe clase parinte in acelasi timp?== | + | **2. Pot sa am mai multe clase parinte in acelasi timp?** |
Desigur, acest mecanism se numeste **mostenire multipla**. Exemplu: | Desigur, acest mecanism se numeste **mostenire multipla**. Exemplu: | ||
Line 132: | Line 132: | ||
Presupunem ca studentul nostru se angajeaza, astfel se creaza o noua clasa **Student_Angajat** (are note, are salariu, lucreaza la o firma si studiaza la o facultate). Observam ca noua clasa, **Student_Angajat**, are ca si parinti ambele clase (Angajat, Student). | Presupunem ca studentul nostru se angajeaza, astfel se creaza o noua clasa **Student_Angajat** (are note, are salariu, lucreaza la o firma si studiaza la o facultate). Observam ca noua clasa, **Student_Angajat**, are ca si parinti ambele clase (Angajat, Student). | ||
- | ===== Modificatori de acces (permisiuni) ===== | + | ===== 3. Modificatori de acces (permisiuni) ===== |
<note>In C++ avem 3 modificatori de acces: | <note>In C++ avem 3 modificatori de acces: | ||
* **public** | * **public** | ||
Line 150: | Line 150: | ||
Tot ce este declarat protected este inaccesibil din exteriorul clasei, exceptie facand doar clasele derivate dintr-o clasa cu atribute protected. Acestea, clasele derivate, pot sa acceseze atributele protected fara a fi nevoie de a folosi metode speciale care returneaza valori. | Tot ce este declarat protected este inaccesibil din exteriorul clasei, exceptie facand doar clasele derivate dintr-o clasa cu atribute protected. Acestea, clasele derivate, pot sa acceseze atributele protected fara a fi nevoie de a folosi metode speciale care returneaza valori. | ||
</note> | </note> | ||
- | ==== Exemplul 1 ==== | + | ==== 3.1. Exemplul 1 ==== |
<code c++ Public.cpp> | <code c++ Public.cpp> | ||
#include <iostream> | #include <iostream> | ||
Line 225: | Line 225: | ||
} | } | ||
</code> | </code> | ||
- | ==== Exemplul 2 ==== | + | ==== 3.2. Exemplul 2 ==== |
| Indicator de vizibilitate ^ Accesibilitate ^ Zona ^ | | Indicator de vizibilitate ^ Accesibilitate ^ Zona ^ | ||
^ public |accesibil |din exteriorul ierahiei | | ^ public |accesibil |din exteriorul ierahiei | | ||
Line 267: | Line 267: | ||
- | ===== Comportamentul metodelor din clasa derivata ===== | + | ===== 4. Comportamentul metodelor din clasa derivata ===== |
- | ==Constructorii == | + | ==== 4.1. Constructorii ==== |
* Din punct de vedere al ordinii, prima oara se apeleaza constructorul / constructorii din clasa de baza si apoi cei din clasa derivata. | * Din punct de vedere al ordinii, prima oara se apeleaza constructorul / constructorii din clasa de baza si apoi cei din clasa derivata. | ||
Line 275: | Line 275: | ||
* Daca implementam un constructor pentru clasa derivata care nu apeleaza un constructor al clasei de baza, atunci, by default, se va apela constructorul fara parametrii al clasei de baza (**acesta trebuie sa existe obligatoriu**, daca nu => eroare) | * Daca implementam un constructor pentru clasa derivata care nu apeleaza un constructor al clasei de baza, atunci, by default, se va apela constructorul fara parametrii al clasei de baza (**acesta trebuie sa existe obligatoriu**, daca nu => eroare) | ||
- | ==Operatorul = == | + | ==== 4.2. Operatorul = ==== |
*Daca este generat automat, sa va apela operatorul = din clasa (clasele) de baza. Insa, daca este implementat de noi, trebuie sa ne asiguram ca are acest comportament (de a apela operatorul = din clasa de baza). | *Daca este generat automat, sa va apela operatorul = din clasa (clasele) de baza. Insa, daca este implementat de noi, trebuie sa ne asiguram ca are acest comportament (de a apela operatorul = din clasa de baza). | ||
- | ==Destructorul== | + | ==== 4.3. Destructorul ==== |
*Din punct de vedere al ordinii, prima oara se apeleaza destructorul din clasa derivata si apoi cel din clasa de baza. | *Din punct de vedere al ordinii, prima oara se apeleaza destructorul din clasa derivata si apoi cel din clasa de baza. | ||
Line 295: | Line 295: | ||
**Nu pot fi virtuale **(notiune aprofundata in cadrul laboratorului 7).</note> | **Nu pot fi virtuale **(notiune aprofundata in cadrul laboratorului 7).</note> | ||
- | ===== Agregare vs derivare ===== | + | ===== 5. Agregare vs derivare ===== |
Amandoua mecanismele reutilizeaza codul scris pentru o clasa de baza/simpla intr-o alta clasa mai complexa. In ambele cazuri se folosesc liste de initializare pentru constructori pentru a crea obiectele de baza (chiar daca apelul difera prin sintaxa). | Amandoua mecanismele reutilizeaza codul scris pentru o clasa de baza/simpla intr-o alta clasa mai complexa. In ambele cazuri se folosesc liste de initializare pentru constructori pentru a crea obiectele de baza (chiar daca apelul difera prin sintaxa). | ||
- | ==== Diferente ==== | + | ==== 5.1. Diferente ==== |
== Agregarea == | == Agregarea == | ||
* folosita cand se doreste reutilizarea unui tip de date A pentru generarea altui tip de date B (**fara a prelua interfata lui A**) | * folosita cand se doreste reutilizarea unui tip de date A pentru generarea altui tip de date B (**fara a prelua interfata lui A**) | ||
Line 304: | Line 304: | ||
* utilizatorii noii clase vor vedea doar interfata acesteia | * utilizatorii noii clase vor vedea doar interfata acesteia | ||
* nu va mai fi de interes interfata clasei de baza | * nu va mai fi de interes interfata clasei de baza | ||
- | == Derivare == | + | == Derivarea == |
* folosita cand se doreste **preluarea interfetei** clasei de baza | * folosita cand se doreste **preluarea interfetei** clasei de baza | ||
* utilizatorul va vedea atat interfata clasei de baza cat si a celei derivate | * utilizatorul va vedea atat interfata clasei de baza cat si a celei derivate | ||
Line 310: | Line 310: | ||
<note>Nu exista nicio diferenta in termeni de: memorie ocupata si durata de executie.</note> | <note>Nu exista nicio diferenta in termeni de: memorie ocupata si durata de executie.</note> | ||
- | == Avantaje == | + | == Avantajele derivarii == |
<note tip>Putem sa adaugam cod nou fara a introduce bug-uri in codul existent. | <note tip>Putem sa adaugam cod nou fara a introduce bug-uri in codul existent. | ||
Line 317: | Line 317: | ||
Clasele sunt clar separate. (Codul poate fi refolosit si in alte locuri fara a avea erori)</note> | Clasele sunt clar separate. (Codul poate fi refolosit si in alte locuri fara a avea erori)</note> | ||
- | ===== Mostenire multipla ===== | + | ===== 6. Mostenire multipla ===== |
- | == Exemplu == | + | ==== 6.1. Exemplu ==== |
<code c++> | <code c++> | ||
#include <iostream> | #include <iostream> | ||
Line 384: | Line 384: | ||
*altele | *altele | ||
</note> | </note> | ||
- | ==== Shadowing, Upcasting ==== | + | ===== 7. Shadowing, Upcasting ===== |
== Shadowing == | == Shadowing == | ||
<code c++> | <code c++> | ||
Line 420: | Line 420: | ||
In aceste cazuri, versiunile metodelor din clasa de baza o sa fie ascunse pentru noua clasa (nu avem acces direct la functiile clasei de baza cu acelasi nume ca cele din clasa derivata). Le putem apela explicit folosind **nume_clasa_baza :: nume_functie**. | In aceste cazuri, versiunile metodelor din clasa de baza o sa fie ascunse pentru noua clasa (nu avem acces direct la functiile clasei de baza cu acelasi nume ca cele din clasa derivata). Le putem apela explicit folosind **nume_clasa_baza :: nume_functie**. | ||
</note> | </note> | ||
- | ===== Pragma Once ===== | + | ===== 8. Pragma Once ===== |
In cazul in care avem ierarhii complicate de clase, trebuie sa avem grija sa nu includem header-ul unei clase de mai multe ori in alt header sau in programul principal. | In cazul in care avem ierarhii complicate de clase, trebuie sa avem grija sa nu includem header-ul unei clase de mai multe ori in alt header sau in programul principal. | ||
<note important>Putem evita acest lucru daca folosim directiva preprocesor **#pragma once**. Aceasta se scrie la inceputul header-ului.</note> | <note important>Putem evita acest lucru daca folosim directiva preprocesor **#pragma once**. Aceasta se scrie la inceputul header-ului.</note> |