This shows you the differences between two versions of the page.
|
poo-is-ab:laboratoare:10 [2025/12/03 22:30] razvan.cristea0106 [Vector de obiecte neomogene] |
poo-is-ab:laboratoare:10 [2025/12/04 09:00] (current) razvan.cristea0106 [Vector de obiecte neomogene] |
||
|---|---|---|---|
| Line 47: | Line 47: | ||
| </code> | </code> | ||
| - | <note important>În C++, unui **destructor virtual pur** trebuie să îi oferim o **implementare** deoarece va fi **întotdeauna apelat** atunci când un **obiect derivat** este **distrus**. Această cerință se bazează pe mecanismul de distrugere a obiectelor, care implică apelarea destructorilor **în ordine inversă** a **constructorilor**, inclusiv pentru clasa de bază.</note> | + | <note>Așa cum am discutat în cadrul laboratorului anterior, atunci când declarăm o metodă ca fiind **virtual pură**, clasa care o conține devine automat o **clasă abstractă**. Totuși, faptul că o **funcție membră** este marcată drept virtual pură **nu ne împiedică deloc** să îi oferim o implementare în clasa unde a fost declarată. Această marcare, exprimată prin sintaxa **''= 0''**, are rolul de a face clasa **neinstanțiabilă**, **nu de a interzice existența unei definiții**. Cu alte cuvinte, putem avea în continuare un **comportament de bază** pentru metoda respectivă, chiar dacă **obligăm subclasele** să o **suprascrie**.</note> |
| - | + | ||
| - | Așa cum am discutat în cadrul laboratorul anterior, atunci când declarăm o metodă ca fiind **virtual pură**, clasa care o conține devine automat o **clasă abstractă**. Totuși, faptul că o **funcție membră** este marcată drept virtual pură **nu ne împiedică deloc** să îi oferim o implementare în clasa unde a fost declarată. Această marcare, exprimată prin sintaxa **''= 0''**, are rolul de a face clasa **neinstanțiabilă**, **nu de a interzice existența unei definiții**. Cu alte cuvinte, putem avea în continuare un **comportament de bază** pentru metoda respectivă, chiar dacă **obligăm subclasele** să o **suprascrie**. | + | |
| În cele ce urmează vom exemplifica printr-o secvență de cod ceea ce am menționat anterior. | În cele ce urmează vom exemplifica printr-o secvență de cod ceea ce am menționat anterior. | ||
| Line 60: | Line 58: | ||
| public: | public: | ||
| - | // Metoda virtual pura: clasa devine abstracta | + | // Metoda este marcata ca fiind virtual pura -> clasa devine abstracta |
| - | // Totusi ii putem oferim o implementare | + | // Totusi ii putem oferi o implementare |
| virtual void f() = 0; | virtual void f() = 0; | ||
| }; | }; | ||
| // Implementarea metodei virtual pure trebuie sa fie in afara clasei, | // Implementarea metodei virtual pure trebuie sa fie in afara clasei, | ||
| - | // deoarece limbajul C++ nu permite definirea | + | // deoarece limbajul C++ nu permite definirea unei metode virtual pure direct in interiorul clasei |
| - | // unei metode virtual pure direct in interiorul clasei. | + | |
| void A::f() | void A::f() | ||
| { | { | ||
| Line 77: | Line 74: | ||
| public: | public: | ||
| - | // B suprascrie metoda f si foloseste implementarea din baza | + | // B suprascrie metoda f si foloseste implementarea din clasa de baza |
| void f() override | void f() override | ||
| { | { | ||
| Line 128: | Line 125: | ||
| | Permite instanțierea clasei de bază? | Da | Nu | | | Permite instanțierea clasei de bază? | Da | Nu | | ||
| | Apelabilă prin pointer la tipul bazei? | Da | Da | | | Apelabilă prin pointer la tipul bazei? | Da | Da | | ||
| + | |||
| + | <note important>În C++, unui **destructor virtual pur** trebuie să îi oferim o **implementare** deoarece va fi **întotdeauna apelat** atunci când un **obiect derivat** este **distrus**. Această cerință se bazează pe mecanismul de distrugere a obiectelor, care implică apelarea destructorilor **în ordine inversă** a **constructorilor**, inclusiv pentru clasa de bază.</note> | ||
| Odată înțelese conceptele privind metodele virtuale și virtual pure, putem oferi implementarea destructorului clasei **ProdusElectronic**, așa cum este ilustrată în codul următor. | Odată înțelese conceptele privind metodele virtuale și virtual pure, putem oferi implementarea destructorului clasei **ProdusElectronic**, așa cum este ilustrată în codul următor. | ||
| Line 174: | Line 173: | ||
| </code> | </code> | ||
| - | Iar implementările metodelor celor două clase se pot observa în blocurile de mai jos. | + | Iar implementările metodelor celor două clase se pot observa în blocurile de cod de mai jos. |
| <code cpp> | <code cpp> | ||