Differences

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

Link to this comparison view

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 puraclasa 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>
poo-is-ab/laboratoare/10.1764793822.txt.gz · Last modified: 2025/12/03 22:30 by razvan.cristea0106
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