This shows you the differences between two versions of the page.
|
poo-is-ab:laboratoare:06 [2025/11/01 12:04] razvan.cristea0106 [Moștenirea între două clase] |
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 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 << (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"; | ||