This shows you the differences between two versions of the page.
|
poo-is-ab:laboratoare:06 [2025/11/01 11:40] razvan.cristea0106 |
poo-is-ab:laboratoare:06 [2025/11/03 21:02] (current) razvan.cristea0106 [Moștenirea între două clase] |
||
|---|---|---|---|
| Line 9: | Line 9: | ||
| * recunoască și să înțeleagă conceptul de moștenire între două clase | * recunoască și să înțeleagă conceptul de moștenire între două clase | ||
| * construiască legături între clase folosind relația de tip "is-a" (relație de specializare) | * construiască legături între clase folosind relația de tip "is-a" (relație de specializare) | ||
| - | * folosească membrii marcați cu protected și să înțeleagă diferențele dintre accesul public, privat și protejat în moștenire | + | * folosească membrii marcați cu protected și să înțeleagă diferențele dintre tipurile de acces |
| * aplice principiile de reutilizare a codului prin extinderea funcționalității clasei de bază în clasa derivată | * aplice principiile de reutilizare a codului prin extinderea funcționalității clasei de bază în clasa derivată | ||
| Line 21: | Line 21: | ||
| Așa cum am menționat anterior, **moștenirea** este un principiu fundamental al **POO** care permite unei **clase derivate** să preia atât **proprietățile (atributele)** cât și **comportamentele (funcțiile membre)** unei **clase părinte**. Prin acest mecanism, **clasa derivată** poate să extindă funcționalitatea moștenită prin adăugarea de noi atribute și metode sau prin redefinirea celor existente. Scopul principal al **moștenirii** este de a promova **reutilizarea codului** și de a permite o **extensie** naturală a funcționalităților inițiale, astfel încât să se creeze o structură mai **flexibilă** și mai **ușor de întreținut** în cadrul aplicațiilor. | Așa cum am menționat anterior, **moștenirea** este un principiu fundamental al **POO** care permite unei **clase derivate** să preia atât **proprietățile (atributele)** cât și **comportamentele (funcțiile membre)** unei **clase părinte**. Prin acest mecanism, **clasa derivată** poate să extindă funcționalitatea moștenită prin adăugarea de noi atribute și metode sau prin redefinirea celor existente. Scopul principal al **moștenirii** este de a promova **reutilizarea codului** și de a permite o **extensie** naturală a funcționalităților inițiale, astfel încât să se creeze o structură mai **flexibilă** și mai **ușor de întreținut** în cadrul aplicațiilor. | ||
| - | Înainte de a explica moștenirea între două clase vom face o scurtă recapitulare a noțiunilor deja învățate în cadrul laboratoarelor anterioare. Pentru acest laborator propunem clasa **Locuinta** care are ca și membri **pret (de tip float)** și **adresa (șir de caractere alocat dinamic)**. | + | Înainte de a explica moștenirea între două clase vom face o scurtă prezentare a modului în care trebuie să gestionăm mai multe fișiere header într-un proiect. Pentru acest laborator propunem clasa **Locuinta** care are ca și membri **pret (de tip float)** și **adresa (șir de caractere alocat dinamic)**. |
| <code cpp> | <code cpp> | ||
| Line 53: | Line 53: | ||
| <note>Pe prima linie a **fișierului header** în care este definită clasa **Locuinta**, putem observa utilizarea directivei **''#pragma once''**. Aceasta este o instrucțiune specifică compilatorului care indică faptul că fișierul respectiv trebuie inclus și compilat o **singură dată**, chiar dacă este referit în mod repetat în alte fișiere prin intermediul directivelor **''#include''**. Astfel, se previn **multiplele incluziuni** ale aceluiași fișier header, care ar putea duce la erori de compilare, cum ar fi redefinirea claselor sau funcțiilor. Directiva **''#pragma once''** este o alternativă modernă și mai simplă la gardienii clasici ai fișierelor header, adică acele secvențe de cod cu **''#ifndef''**, **''#define''** și **''#endif''** care au același scop.</note> | <note>Pe prima linie a **fișierului header** în care este definită clasa **Locuinta**, putem observa utilizarea directivei **''#pragma once''**. Aceasta este o instrucțiune specifică compilatorului care indică faptul că fișierul respectiv trebuie inclus și compilat o **singură dată**, chiar dacă este referit în mod repetat în alte fișiere prin intermediul directivelor **''#include''**. Astfel, se previn **multiplele incluziuni** ale aceluiași fișier header, care ar putea duce la erori de compilare, cum ar fi redefinirea claselor sau funcțiilor. Directiva **''#pragma once''** este o alternativă modernă și mai simplă la gardienii clasici ai fișierelor header, adică acele secvențe de cod cu **''#ifndef''**, **''#define''** și **''#endif''** care au același scop.</note> | ||
| - | Dacă voiam să folosim varianta tradițională de scriere a unui fișier header am fi procedat în maniera următoare. | + | Dacă am dori să folosim varianta tradițională de scriere a unui fișier header, astfel încât acesta să fie inclus o singură dată, am putea proceda în maniera următoare. |
| <code cpp> | <code cpp> | ||
| Line 122: | Line 122: | ||
| void setNumarCamere(const int& numarCamere); | void setNumarCamere(const int& numarCamere); | ||
| - | void setNumarCamere(const char* numeProprietar); | + | void setNumeProprietar(const char* numeProprietar); |
| friend std::ostream& operator<<(std::ostream& out, const Apartament& apartament); | friend std::ostream& operator<<(std::ostream& out, const Apartament& apartament); | ||
| Line 290: | Line 290: | ||
| { | { | ||
| operator<<(out, (Locuinta&)apartament); // chemam operatorul << din clasa parinte | operator<<(out, (Locuinta&)apartament); // chemam operatorul << din clasa parinte | ||
| + | /*out << (Locuinta&)apartament; // o alta forma de a chema operatorul << din clasa parinte*/ | ||
| out << "Numarul de camere din apartament este: " << apartament.numarCamere << " ron\n"; | out << "Numarul de camere din apartament este: " << apartament.numarCamere << " ron\n"; | ||
| Line 306: | Line 307: | ||
| </code> | </code> | ||
| - | <note warning>**Funcțiile friend** dintr-o clasă **nu** se moștenesc automat de către **clasa derivată**, motiv pentru care trebuie să apelăm explicit **operatorul %%<<%%** definit în **clasa de bază**. Pentru a înțelege mai bine acest comportament, putem face următoarea analogie: prietenii părinților voștri **nu sunt neapărat** și prietenii voștri. Relația de prietenie este specifică **doar** între părinții voștri și acele persoane, iar aceasta **nu se extinde automat** asupra voastră. La fel, funcțiile **friend** sunt prietene ale **clasei părinte**, dar **nu** devin prietene implicit și pentru **clasa derivată**.</note> | + | <note warning>**Funcțiile friend** dintr-o clasă **nu** se moștenesc automat de către **clasa derivată**, motiv pentru care trebuie să apelăm explicit **operatorul %%<<%%** definit în **clasa de bază**. Pentru a înțelege mai bine acest comportament, putem privi lucrurile astfel: prietenii părinților noștri **nu sunt neapărat** și prietenii noștri. Relația de prietenie este specifică **doar** între părinții noștri și acele persoane, iar aceasta **nu se extinde automat** asupra noastră. La fel, funcțiile **friend** sunt prietene ale **clasei părinte**, dar **nu** devin prietene implicit și pentru **clasa derivată**.</note> |
| ==== ==== | ==== ==== | ||