This shows you the differences between two versions of the page.
poo-is:laboratoare:06 [2020/09/29 22:35] alexandru.ionita99 |
poo-is:laboratoare:06 [2020/09/29 22:44] (current) alexandru.ionita99 [5.1. Diferente] |
||
---|---|---|---|
Line 268: | Line 268: | ||
===== 4. Comportamentul metodelor din clasa derivata ===== | ===== 4. Comportamentul metodelor din clasa derivata ===== | ||
- | ===== 4.1. Constructorii ===== | + | ==== 4.1. Constructorii ==== |
* Din punct de vedere al ordinii, prima oara se apeleaza constructorul / constructorii din clasa de baza si apoi cei din clasa derivata. | * Din punct de vedere al ordinii, prima oara se apeleaza constructorul / constructorii din clasa de baza si apoi cei din clasa derivata. | ||
Line 275: | Line 275: | ||
* Daca implementam un constructor pentru clasa derivata care nu apeleaza un constructor al clasei de baza, atunci, by default, se va apela constructorul fara parametrii al clasei de baza (**acesta trebuie sa existe obligatoriu**, daca nu => eroare) | * Daca implementam un constructor pentru clasa derivata care nu apeleaza un constructor al clasei de baza, atunci, by default, se va apela constructorul fara parametrii al clasei de baza (**acesta trebuie sa existe obligatoriu**, daca nu => eroare) | ||
- | ===== 4.2. Operatorul = ===== | + | ==== 4.2. Operatorul = ==== |
*Daca este generat automat, sa va apela operatorul = din clasa (clasele) de baza. Insa, daca este implementat de noi, trebuie sa ne asiguram ca are acest comportament (de a apela operatorul = din clasa de baza). | *Daca este generat automat, sa va apela operatorul = din clasa (clasele) de baza. Insa, daca este implementat de noi, trebuie sa ne asiguram ca are acest comportament (de a apela operatorul = din clasa de baza). | ||
- | ==== 4.3. Destructorul ===== | + | ==== 4.3. Destructorul ==== |
*Din punct de vedere al ordinii, prima oara se apeleaza destructorul din clasa derivata si apoi cel din clasa de baza. | *Din punct de vedere al ordinii, prima oara se apeleaza destructorul din clasa derivata si apoi cel din clasa de baza. | ||
Line 298: | Line 298: | ||
Amandoua mecanismele reutilizeaza codul scris pentru o clasa de baza/simpla intr-o alta clasa mai complexa. In ambele cazuri se folosesc liste de initializare pentru constructori pentru a crea obiectele de baza (chiar daca apelul difera prin sintaxa). | Amandoua mecanismele reutilizeaza codul scris pentru o clasa de baza/simpla intr-o alta clasa mai complexa. In ambele cazuri se folosesc liste de initializare pentru constructori pentru a crea obiectele de baza (chiar daca apelul difera prin sintaxa). | ||
- | ==== Diferente ==== | + | ==== 5.1. Diferente ==== |
== Agregarea == | == Agregarea == | ||
* folosita cand se doreste reutilizarea unui tip de date A pentru generarea altui tip de date B (**fara a prelua interfata lui A**) | * folosita cand se doreste reutilizarea unui tip de date A pentru generarea altui tip de date B (**fara a prelua interfata lui A**) | ||
Line 304: | Line 304: | ||
* utilizatorii noii clase vor vedea doar interfata acesteia | * utilizatorii noii clase vor vedea doar interfata acesteia | ||
* nu va mai fi de interes interfata clasei de baza | * nu va mai fi de interes interfata clasei de baza | ||
- | == Derivare == | + | == Derivarea == |
* folosita cand se doreste **preluarea interfetei** clasei de baza | * folosita cand se doreste **preluarea interfetei** clasei de baza | ||
* utilizatorul va vedea atat interfata clasei de baza cat si a celei derivate | * utilizatorul va vedea atat interfata clasei de baza cat si a celei derivate | ||
Line 310: | Line 310: | ||
<note>Nu exista nicio diferenta in termeni de: memorie ocupata si durata de executie.</note> | <note>Nu exista nicio diferenta in termeni de: memorie ocupata si durata de executie.</note> | ||
- | == Avantaje == | + | == Avantajele derivarii == |
<note tip>Putem sa adaugam cod nou fara a introduce bug-uri in codul existent. | <note tip>Putem sa adaugam cod nou fara a introduce bug-uri in codul existent. | ||
Line 317: | Line 317: | ||
Clasele sunt clar separate. (Codul poate fi refolosit si in alte locuri fara a avea erori)</note> | Clasele sunt clar separate. (Codul poate fi refolosit si in alte locuri fara a avea erori)</note> | ||
- | ===== Mostenire multipla ===== | + | ===== 6. Mostenire multipla ===== |
- | == Exemplu == | + | ==== 6.1. Exemplu ==== |
<code c++> | <code c++> | ||
#include <iostream> | #include <iostream> | ||
Line 384: | Line 384: | ||
*altele | *altele | ||
</note> | </note> | ||
- | ==== Shadowing, Upcasting ==== | + | ===== 7. Shadowing, Upcasting ===== |
== Shadowing == | == Shadowing == | ||
<code c++> | <code c++> | ||
Line 420: | Line 420: | ||
In aceste cazuri, versiunile metodelor din clasa de baza o sa fie ascunse pentru noua clasa (nu avem acces direct la functiile clasei de baza cu acelasi nume ca cele din clasa derivata). Le putem apela explicit folosind **nume_clasa_baza :: nume_functie**. | In aceste cazuri, versiunile metodelor din clasa de baza o sa fie ascunse pentru noua clasa (nu avem acces direct la functiile clasei de baza cu acelasi nume ca cele din clasa derivata). Le putem apela explicit folosind **nume_clasa_baza :: nume_functie**. | ||
</note> | </note> | ||
- | ===== Pragma Once ===== | + | ===== 8. Pragma Once ===== |
In cazul in care avem ierarhii complicate de clase, trebuie sa avem grija sa nu includem header-ul unei clase de mai multe ori in alt header sau in programul principal. | In cazul in care avem ierarhii complicate de clase, trebuie sa avem grija sa nu includem header-ul unei clase de mai multe ori in alt header sau in programul principal. | ||
<note important>Putem evita acest lucru daca folosim directiva preprocesor **#pragma once**. Aceasta se scrie la inceputul header-ului.</note> | <note important>Putem evita acest lucru daca folosim directiva preprocesor **#pragma once**. Aceasta se scrie la inceputul header-ului.</note> |