This shows you the differences between two versions of the page.
|
poo-is-ab:laboratoare:10 [2025/12/03 22:34] 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> | ||
| - | 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**. | + | <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> |
| Î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 58: | 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 75: | 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 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> | ||