Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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>​
poo-is/laboratoare/06.1601407659.txt.gz · Last modified: 2020/09/29 22:27 by alexandru.ionita99
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0