Differences

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

Link to this comparison view

poo-is-ab:laboratoare:09 [2025/11/26 22:30]
razvan.cristea0106 [Interfețe]
poo-is-ab:laboratoare:09 [2025/12/09 11:26] (current)
razvan.cristea0106 [Metode virtuale]
Line 29: Line 29:
 | Funcțiile/​metodele au **același nume**, dar **diferă** prin **numărul, tipul sau ordinea parametrilor** | O metodă dintr-o clasă derivată **suprascrie** comportamentul unei **metode virtuale** din clasa de bază | | Funcțiile/​metodele au **același nume**, dar **diferă** prin **numărul, tipul sau ordinea parametrilor** | O metodă dintr-o clasă derivată **suprascrie** comportamentul unei **metode virtuale** din clasa de bază |
 | Alegerea funcției/​metodei este făcută de către **compilator** pe baza semnăturii acesteia | Alegerea metodei care va fi apelată este făcută la **runtime**,​ în funcție de **tipul dinamic** al obiectului | | Alegerea funcției/​metodei este făcută de către **compilator** pe baza semnăturii acesteia | Alegerea metodei care va fi apelată este făcută la **runtime**,​ în funcție de **tipul dinamic** al obiectului |
-| **Nu** necesită metode virtuale/​virtual pure                              | **Necesită** utilizarea metodelor virtuale/​virtual pure în clasa de bază|+| **Nu** necesită metode virtuale/​virtual pure                               | **Necesită** utilizarea metodelor virtuale/​virtual pure în clasa de bază |
 | Este o formă de polimorfism timpuriu (**early binding**) ​   | Este o formă de polimorfism întârziat (**late binding**) ​ | | Este o formă de polimorfism timpuriu (**early binding**) ​   | Este o formă de polimorfism întârziat (**late binding**) ​ |
 | Are un impact **redus** asupra performanței,​ deoarece decizia se ia la compilare | Are un impact **ușor mai mare** asupra performanței,​ deoarece decizia se ia în timpul execuției | | Are un impact **redus** asupra performanței,​ deoarece decizia se ia la compilare | Are un impact **ușor mai mare** asupra performanței,​ deoarece decizia se ia în timpul execuției |
Line 95: Line 95:
     b.afisare();​ // se apeleaza metoda din Baza (partea din clasa Derivata este "​taiata"​)     b.afisare();​ // se apeleaza metoda din Baza (partea din clasa Derivata este "​taiata"​)
  
-    delete ptr; 
     return 0;     return 0;
 } }
 </​code>​ </​code>​
  
-<​note>​În C++ există **două** tipuri de metode virtuale și anume: **metode virtuale** și **metode virtual pure**. Diferența între cele două tipuri constă în faptul că o metodă ​virtual ​pură **nu** are implementare ​în **clasa de bază**.</​note>​+<​note>​În C++ există **două** tipuri de metode virtuale și anume: **metode virtuale** și **metode virtual pure**. Diferența între cele două tipuri constă în faptul că unei metode ​virtual ​pure **îi poate lipsi** implementarea ​în **clasa de bază**.</​note>​
  
 În continuare propunem ca și exemplu practic clasele **Animal** și **Caine**, unde ne dorim să punem în evidență conceputul de **late binding** și să adăugăm informații noi cu privire la acestă noțiune nouă pe care o învățăm. În continuare propunem ca și exemplu practic clasele **Animal** și **Caine**, unde ne dorim să punem în evidență conceputul de **late binding** și să adăugăm informații noi cu privire la acestă noțiune nouă pe care o învățăm.
Line 220: Line 219:
 ==== Clase abstracte ==== ==== Clase abstracte ====
  
-În limbajul C++, o **clasă abstractă** este o clasă care conține **cel puțin** o **metodă virtuală pură**. **Metoda virtuală pură** este o funcție membră declarată în clasa de bază, dar care **nu are o implementare** în această clasă, **obligând** astfel **clasele derivate** să o **suprascrie**. O **clasă abstractă** este utilizată pentru a defini un comportament **general** care trebuie să fie specificat în **mod detaliat** în **clasele derivate**.+În limbajul C++, o **clasă abstractă** este o clasă care conține **cel puțin** o **metodă virtuală pură**. **Metoda virtuală pură** este o funcție membră declarată în clasa de bază, dar care **nu are neapărat ​o implementare** în această clasă, **obligând** astfel **clasele derivate** să o **suprascrie**. O **clasă abstractă** este utilizată pentru a defini un comportament **general** care trebuie să fie specificat în **mod detaliat** în **clasele derivate**.
  
-<note warning>​O clasă abstractă **nu** poate fi folosită pentru a crea **obiecte**. Este concepută să fie doar o bază pentru alte clase care o vor moșteni. În schimb se pot instanția **pointeri** de tipul acestei clase care să fie inițializati cu ajutorul **claselor derivate**. Un alt aspect ce trebuie menționat este faptul că **orice** clasă derivată dintr-o clasă abstractă **trebuie** să implementeze **toate** metodele virtual pure, altfel va deveni ea însăși o **clasă abstractă**.</​note>​+<note warning>​O clasă abstractă **nu** poate fi folosită pentru a crea **obiecte**. Este concepută să fie doar o bază pentru alte clase care o vor **moșteni**. În schimb se pot instanția **pointeri** de tipul acestei clase care să fie inițializati cu ajutorul **claselor derivate**. Un alt aspect ce trebuie menționat este faptul că **orice** clasă derivată dintr-o clasă abstractă **trebuie** să implementeze **toate** metodele virtual pure, altfel va deveni ea însăși o **clasă abstractă**.</​note>​
  
 O clasă abstractă poate avea membri și metode precum constructori,​ getteri, setteri și destructor care vor fi apelate în clasele derivate. În continuare vom prezenta modul în care putem pune în evidență conceptul de **late binding** transformând clasa **Animal** într-o clasă abstractă. O clasă abstractă poate avea membri și metode precum constructori,​ getteri, setteri și destructor care vor fi apelate în clasele derivate. În continuare vom prezenta modul în care putem pune în evidență conceptul de **late binding** transformând clasa **Animal** într-o clasă abstractă.
Line 372: Line 371:
 | **Membri de date** ​         | Nu poate avea membri ​      | Poate avea membri ​           | | **Membri de date** ​         | Nu poate avea membri ​      | Poate avea membri ​           |
 | **Constructori** ​           | Nu poate avea constructori ​        | Poate avea constructori ​             | | **Constructori** ​           | Nu poate avea constructori ​        | Poate avea constructori ​             |
-| **Moștenire multiplă** ​     | Este utilizată pentru moștenirea multiplă, mai ales pentru a defini contracte comune | Este utilizată în ierarhii, dar poate genera ambiguități în moștenirea multiplă |+| **Moștenire multiplă** ​     | Este utilizată pentru moștenirea multiplă, mai ales pentru a defini contracte comune | Este utilizată în ierarhii ​de clase, dar poate genera ambiguități în moștenirea multiplă |
 | **Scop** ​                   | Definește un contract strict pentru clasele derivate | Definește un comportament parțial și oferă reutilizarea codului | | **Scop** ​                   | Definește un contract strict pentru clasele derivate | Definește un comportament parțial și oferă reutilizarea codului |
 | **Destructor** ​             | Destructorul virtual pur este obligatoriu atunci când în clasele derivate există membri de tip pointer alocați dinamic | Destructorul virtual trebuie implementat atunci când există pointeri alocați dinamic în clasele derivate | | **Destructor** ​             | Destructorul virtual pur este obligatoriu atunci când în clasele derivate există membri de tip pointer alocați dinamic | Destructorul virtual trebuie implementat atunci când există pointeri alocați dinamic în clasele derivate |
poo-is-ab/laboratoare/09.1764189002.txt.gz · Last modified: 2025/11/26 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