This shows you the differences between two versions of the page.
poo-is:laboratoare:07 [2020/09/27 17:35] ruben_gilian.udroiu [Legarea Statica] |
poo-is:laboratoare:07 [2020/09/30 17:27] (current) alexandru.ionita99 |
||
---|---|---|---|
Line 5: | Line 5: | ||
* Capitolul 15 (Chapter 15: Polymorphism and Virtual Functions, pag. 661 - 693) | * Capitolul 15 (Chapter 15: Polymorphism and Virtual Functions, pag. 661 - 693) | ||
- | ====== Introducere ====== | + | ===== 1. Introducere ===== |
<note important>**Functiile virtuale** permit claselor derivate sa inlocuiasca implementarea metodelor din clasa de baza - **suprascriere/supraincarcare/override**- si pun la dispozitie mecanismul de legare dinamica.</note> | <note important>**Functiile virtuale** permit claselor derivate sa inlocuiasca implementarea metodelor din clasa de baza - **suprascriere/supraincarcare/override**- si pun la dispozitie mecanismul de legare dinamica.</note> | ||
O functie virtuala este membra a clasei de baza si este redefinita(overriden) de o clasa derivata. | O functie virtuala este membra a clasei de baza si este redefinita(overriden) de o clasa derivata. | ||
Line 17: | Line 17: | ||
- | ====== Legarea Statica ====== | + | ===== 2. Legarea Statica ===== |
Line 90: | Line 90: | ||
- | ====== Legarea Dinamica ====== | + | ===== 3. Legarea Dinamica ===== |
**Legare dinamica/tarzie(Late binding):** | **Legare dinamica/tarzie(Late binding):** | ||
Line 140: | Line 140: | ||
Dar cum reuseste acesta sa puna in actiune toate mecanismele necesare realizarii de legaturi | Dar cum reuseste acesta sa puna in actiune toate mecanismele necesare realizarii de legaturi | ||
dinamice? | dinamice? | ||
- | <note tip>Pentru aceasta compilatorul creeaza un tabel numit **VTABLE** pentru fiecare clasa care | + | <note tip>Pentru aceasta, compilatorul creeaza un tabel numit **VTABLE** pentru fiecare clasa care |
contine macar o functie virtuala. | contine macar o functie virtuala. | ||
Line 161: | Line 161: | ||
- | ====== Polimorfism si functii virtuale ====== | + | ===== 4. Polimorfism si functii virtuale ===== |
- | <note>“poli” – mai multe;“morf” –forma | + | <note>“poli” – mai multe; “morf” – forma |
</note> | </note> | ||
Line 201: | Line 201: | ||
Baza(int ); | Baza(int ); | ||
void set_atr1(int ); | void set_atr1(int ); | ||
- | **virtual** void afisare(); | + | virtual void afisare(); |
- | **virtual** ~Baza(){}; | + | virtual ~Baza(){}; |
}; | }; | ||
</code> | </code> | ||
Line 232: | Line 232: | ||
</code> | </code> | ||
- | <code c++ main.cpp> | + | <code c++ Derivata.cpp> |
#include "Derivata.h" | #include "Derivata.h" | ||
Derivata::Derivata() { } | Derivata::Derivata() { } | ||
Line 245: | Line 245: | ||
</code> | </code> | ||
- | <code c++ Derivata.cpp> | + | <code c++ main.cpp> |
#include "Derivata.h" | #include "Derivata.h" | ||
int main(int argc, char *argv[]) { | int main(int argc, char *argv[]) { | ||
Line 251: | Line 251: | ||
cout << "Dati dimensiunea"; | cout << "Dati dimensiunea"; | ||
cin >> n; | cin >> n; | ||
- | **Baza ****vec = new **Baza***[n]; | + | Baza **vec = new Baza*[n]; |
for (int i = 0; i < n; i++){ | for (int i = 0; i < n; i++){ | ||
cout << "Introduceti obiect de tip Baza(0) sau Derivata(1)?"; | cout << "Introduceti obiect de tip Baza(0) sau Derivata(1)?"; | ||
Line 260: | Line 260: | ||
int a1; | int a1; | ||
cin >> a1; | cin >> a1; | ||
- | vec[i] = **new Baza(a1)**; | + | vec[i] = new Baza(a1); |
} | } | ||
else if (tip == 1){ | else if (tip == 1){ | ||
Line 266: | Line 266: | ||
int a1, a2; | int a1, a2; | ||
cin >> a1; cin >> a2; | cin >> a1; cin >> a2; | ||
- | vec[i] = **new Derivata(a1,a2)**; | + | vec[i] = new Derivata(a1,a2); |
} else i--; | } else i--; | ||
} | } | ||
for (int i = 0; i < n; i++) | for (int i = 0; i < n; i++) | ||
- | **vec[i]->afisare()**; | + | vec[i]->afisare(); |
//comportament polimorf; nu mai testez eu care e tipul si nu fac conversii explicite | //comportament polimorf; nu mai testez eu care e tipul si nu fac conversii explicite | ||
//Baza *b = new Derivata(1,1); | //Baza *b = new Derivata(1,1); | ||
// b->set_atr2(2); | // b->set_atr2(2); | ||
//atentie, set_atr2 nu e o functie din Baza | //atentie, set_atr2 nu e o functie din Baza | ||
- | //**ERROR:'class Baza' has no member named 'set_atr2'** | + | //ERROR:'class Baza' has no member named 'set_atr2' |
return 0; | return 0; | ||
} | } | ||
Line 283: | Line 283: | ||
**Recomandari** | **Recomandari** | ||
- | 1. Se recomanda sa se declare ca virtuale, functiile care, in derivari | + | -Se recomanda sa se declare ca virtuale, functiile care, in derivari ulterioare NU isi schimba semnificatia (acelasi nume, semnatura, tip returnat), ci doar li se modifica / adapteaza implementarea /comportamentul (in functie de noul tip de date). |
- | ulterioare NU isi schimba semnificatia (acelasi nume, semnatura, tip | + | -Daca o clasa are macar o functie virtuala, destructorul trebuie declarat virtual. |
- | returnat), ci doar li se modifica / adapteaza implementarea /comportamentul | + | |
- | (in functie de noul tip de date). | + | |
- | + | ||
- | 2. Daca o clasa are macar o functie virtuala, destructorul trebuie declarat | + | |
- | virtual. | + | |
</note> | </note> | ||