Sunteți pe pagina 1din 5

LUCRAREA DE LABORATOR NR4

Tema: Moştenirea şi compoziţia


Scopul lucrării:
 studierea moştenirii, avantajele şi dezavantajele;
 studierea compoziţiei;
 studierea regulilor de definire a moştenirii şi compoziţiei;
 studierea formelor de moştenire;
 studierea iniţializatorilor;
 principiul de substituţie;
 moştenirea şi compoziţia – ce să alegem.

Noţiuni de bază

Motivarea
Moştenirea reprezintă unul din cele trei mecanisme de bază a moştenirii orientate pe
obiecte. Moştenirea poate fi studiată din două puncte de vedere: dezvoltatorului şi utilizatorului
clasei.
Din punct de vedere a dezvoltatorului moştenirea înseamnă, că comportarea şi proprietăţile
clasei derivate, sunt nişte dezvoltări a clasei de bază. Din punct de vedere a utilizatorului –
moştenirea reprezintă existenţa unor particularităţi de schimbare independenta a claselor cu o
interfaţă unică (Inginerii TI şi constructorii de automobile, în primul rând sunt inginerii).
Avantajele moştenirii:
- micşorarea cantităţii codului şi folosirea lui repetată;
- micşorarea cantităţii erorilor şi a preţului de cost;
- o interfaţa unică şi substituţia;
- mărirea vitezei de prelucrare;
Cheltuielile moştenirii: unicele cheltuieli la folosirea moştenirii poate fi numită micşorarea
vitezei la compilarea codului. Totuşi preocupările de eficacitate nu trebuie să intre in
contrazicere cu avantajele, aşa cum cheltuielile, cu adevărat, nu sunt esenţiale, aşa cum unele
din ele pot fi ocolite prin utilizarea funcţiilor de substituire.

Definirea şi utilizarea moştenirii:


Moştenirea se desemnează prin indicarea clasei de bază după numele clasei derivate, după
două puncte. Ca de exemplu:

class Animal{
int NofLegs;
public:
void Say(){ cout<<”!!!”; }
};
class Dog: public Animal{ // moştenirea
...
};
void main(){
Dog d;
d.Say();
}

Din exemplu se vede, că funcţia şi variabila, sunt definite în clasa Animal sunt importate şi
pot fi utilizate de obiectul clasei Dog. Starea, ce complică percepţia acestui mecanism, consta din
aceia că, clasa derivată poate sa-şi definească comportamentul, primit în clasa de bază. (Struţul şi
pinguinul nu zboară, deşi sunt păsări, dar ornitoringul depune ouă, deşi este manifer). Ne vom
întoarce la aceasta temă în următoarele lucrări de laborator.
Principiul de substituţiei
Adăugând la cele relatate mai sus, putem spune că, moştenirea presupune, că obiectul
clasei derivate poate fi utilizat în locul obiectului de bază:

void main(){
Animal *ptr = new Dog;
}
Din exemplu se vede că sunt indice la clasa de bază – deci se aşteaptă utilizarea obiectului
de bază, dar, indicatorului i se atribuie obiectul derivatei.

Formele moştenirii
În relaţiile moştenirii, C++ este un limbaj foarte bogat, aşa cum există cinci forme diferite
de moştenire. În această lucrare de laborator noi vom studia trei dintre ele, acele care se numesc
simple.
- deschisă;
- închisă;
- protejată;
Diferite forme de moştenire sunt utilizate, pentru a modifica starea accesului pentru
variabilele membre clasei. De exemplu, la utilizarea moştenirii închise, toate care sunt accesibile
(deschise şi protejate) variabilele clasei de bază devin închise în derivare. Dar prin utilizarea
derivării protejate – protejate. Variabilele închise a clasei de bază prin orice forma de derivare
devin inaccesibile. Mai mult ca atât, metodele de moştenire, se deosebesc prin aceia, că
moştenirea deschisă creează un subtip de date, adică există principiul de substituţie, dar protejata
şi deschisa nu.

Compoziţia
Compoziţia reprezintă încă un mecanism, legat de programarea orientată pe obiecte, care
reprezintă relaţia dintre obiecte, atunci când moştenirea este relaţia dintre clase.
Moştenirea realizează relaţia a fi „is a ”. Dog este mamifer, iar mamiferul – animal.
Compoziţia realizează relaţia de a conţine „has a ”. Automobilul conţine motor şi roţi.

Definirea compoziţiei
Cu adevărat compoziţia este folosită foarte larg, aşa cum variabilele încorporate conţin un
tip şi sunt utilizate la definirea clasei. Dar la folosirea variabilelor încorporate nu apar întrebări,
ceia ce nu se poate spune despre clasele utilizatorilor. Definirea nu este grea, însă utilizarea
constructorilor creează probleme.
class Car{
Engine e;
};
Iniţializatorii
Cum se ştie variabilele închise a clasei de bază devin inaccesibile, deci, ele nu pot fi iniţiate
în constructor, mai mult ca atât, aceasta contrazice principiul repetării codului. Soluţia este una –
chemarea constructorului clasei de bază. Aşa şi se întâmplă, numai că pentru constructorii
impliciţi şi copiilor sunt generate de compilator. Restul trebuie să fie chemate manual. Aceiaşi
problemă apare şi la utilizarea compoziţiei, poate fi utilizat numai constructorul implicit şi
copiile. Pentru rezolvarea acestor probleme se utilizează iniţializatorii – care permit chemarea
constructorilor şi efectuarea oricărei iniţializări.
class Engine{
int power;
public:
Engine(int p){power=p;}
};
class Transport{
...
public:
Transport(char*);
};
class Car:public Transport{ // наследование
Engine e; // композиция
public:
Car():Transport(“automobile”),e(10){}
};

Pentru chemarea constructorului clasei de bază, după parantezele rotunde a constructorului


derivat se scrie constructorul de bază, mai mult ca atât se poate de transmis parametrii derivatei
de bază. La utilizarea compoziţiei starea este aceeaşi, numai că sunt scrise numele variabilelor
dar nu a constructorului.
Ce să alegem ?
Aşa ca şi moştenirea şi compoziţia este un instrument de reutilizare a codului, deci apare
întrebare: cînd să utilizam moştenirea şi cînd să utilizam compoziţia. Există o mulţime de
recomandări în acest sens, dar, mai uşor este de memorat următoare regulă: trebuie sa-ţi pui
următoarea întrebare: noua clasa este un subtip (Dog is an Animal), dacă noi am obţinut un
răspuns afirmativ atunci trebuie fi utilizată moştenirea, în caz contrar apare altă întrebare: nu este
noua clasă un container (Car has a door) – în acest caz compoziţia.
Cu părere de rău, pentru câteva cazuri această strategie este inutilă. Ca de exemplu, clasa
mulţime poate fi creată pe baza clasei listă, ce metodă să folosim. Se poate moştenirea şi se poate
compoziţia. În acest caz regulile sunt complicate. Trebuie să-ţi pui cîteva întrebări:
- vor fi obiectele noii clase substituite în locul vechii clase?
- trebuie de redefinit o funcţie virtuală ?
- prelucrează noul tip aceleaşi mesaje ca şi vechiul ?
- nu este clasa de bază abstractă ?
Dacă răspunsul este afirmativ, utilizaţi moştenirea.

Întrebări de control:

1. Prin ce se deosebesc formele de moştenire?


2. Ce reprezintă compoziţia ?
3. Care sunt avantajele moştenirii?
4. Cum lucrează constructorii la moştenire?
5. Ce reprezintă principiul de substituţie?
6. În ce cazuri se utilizează moştenirea şi în care se utilizează compoziţia?
7. Cum pot fi iniţiate elementele containerului?
Sarcina

Varianta 1
a) De creat clasa roata, care conţine rază. Determinaţi constructorii şi metodele de acces. Creaţi
clasa automobil, care conţine roţi şi un câmp care reprezintă firma producătoare. Creaţi o clasă
derivată autocamion care se deosebeşte prin tonaj. Determinaţi constructorii, destructorii şi alte
funcţii necesare.
Varianta 2
а) De creat clasa student, care are un nume, specialitate, anul de învăţământ şi balul mediu.
Determinaţi funcţia de definire, schimbare a datelor şi comparare. Pentru sarcina câmpurilor
textuale se foloseşte operatorul new. Determinaţi constructorul, destructorul şi alte funcţii
necesare. Creaţi clasa derivată student-diplomant, pentru care este definită tema de diplomă.
Deasemenea, este necesar de definit toate funcţiile necesare.
Varianta 3
а) De creat clasa mobilă, care conţine informaţie despre preţ, stil şi domeniul de utilizare (oficiu,
bucătărie şi altă modilă). Pentru sarcina câmpurilor textuale folosiţi memoria dinamică. Definiţi
clasele derivate masa şi scaun. Determinaţi constructorii, destructorii, operatorii de atribuire şi
alte funcţii necesare.
Varianta 4
а) De creat o ierarhie a claselor om şi colaborator, care ocupă un post anumit şi primeşte un
salariu anumit. Determinaţi fluxul de ieşire şi fluxul de intrare, constructorul de copiere,
operatorii de atribuire prin anumite funcţii a clasei de bază.
Varianta 5
a) De creat clasa buton, care conţine un text anumit. Determinaţi constructorii şi metodele de
acces. Creaţi clasa fereastra, care conţine un buton şi coordonatele ferestrei. Definiţi
constructorii şi destructorii. Definiţi clasa derivată fereastra cu buton şi cu un mesaj. Definiţi
constructorii, destructorii şi operatorii fluxului de ieşire.

Varianta 6
а) De creat clasa om, care are un nume (pointer la cîmp), vîrsta, greutate. Determinaţi
constructorii, destructorii şi operatorii de atribuire. Creaţi clasa derivata - major, care are
numărul paşaportului. Definiţi constructorii impliciţi cu diferiţi parametri, destructorii, operatorii
fluxului de ieşire. Definiţi funcţiile destinate vîrstei şi numărului paşaportului.
Varianta 7
a) De creat clasa student, care are un nume, specialitate, anul de învăţământ şi balul mediu.
Determinaţi funcţia de definire, schimbare a datelor şi comparare. Pentru sarcina câmpurilor
textuale se foloseşte operatorul new. Determinaţi constructorul, destructorul şi alte funcţii
necesare. Creaţi clasa grupa, care conţine studenţi (o cantitate nelimitată). Definiţi metodele de
adăugare şi eliminare a studenţilor, determinarea balului mediu pe grupă, constructorii,
destructorii şi alte funcţii necesare.
Varianta 8
a) De creat clasa motor, care are o firmă producătoare, tip şi putere. Determinaţi funcţiile de
definire, schimbare a parametrilor motoarelor. Creaţi o ierarhie a claselor: corabie – clasa de bază
şi vapor pentru pasageri – derivată. Corabia are un motor, capacitate de încărcare, măsurător de
apă, denumire, portul unde este înscris. Pentru sarcina cîmpurilor textuale, utilizaţi operatorul
new.
Varianta 9
a) De creat clasa Procesor, care conţine informaţia despre denumirea procesorului, frecvenţa lui,
tehnologiile utilizate de producere şi mărimea memoriei. Determinaţi clasa computer , care este
compusă dintr-un procesor şi alte componente. Pentru sarcina cîmpurilor textuale, utilizaţi
operatorul new. Determinaţi constructorii funcţiile fluxului de ieşire şi alte funcţii necesare.
Varianta 10
a) Definiţi clasa element chimic, care conţine informaţia despre denumirea elementului şi
proprietăţile ei chimice. Determinaţi clasa medicamente, care conţine diferite elemente chimice
şi diferite cantităţi. Determinaţi constructorii, funcţiile fluxului de ieşire şi alte funcţii necesare.

Varianta 11
a) De creat clasa dispozitiv de colectare a informaţiei despre starea timpului care este compusă
din senzori după clasa senzor. Pentru citirea valorilor de creat clasa generatorul de valori pentru
fiecare senzor. Demonstraţi lucrul dispozitivului.

Varianta 12
a) De creat o ierarhie a claselor Figuri de şah clasa abstractă, care conţine câmpul – culoarea.
Creaţi clasa derivată toate figurile, care conţine denumirea ei şi coordonatele poziţiei pe tablă.
Pentru sarcina cîmpurilor textuale, utilizaţi operatorul new. Determinaţi fluxul de ieşire şi fluxul
de intrare, constructorul de copiere, operatorul de atribuire prin funcţia corespunzătoare a clasei
de bază.
Varianta 13
а) De creat o ierarhie a claselor joc – joc sportiv – volei. Determinaţi constructorii, destructorii,
operatorii de atribuire şi alte funcţii obligatorii.
Varianta 14
a) De creat clasa camera, care conţine suprafaţă. Determinaţi constructorii şi metodele de acces.
Creaţi clasa apartamente cu o odaie, care conţine o odaie şi o bucătarie (suprafaţa ei), etajul
(camera este în clasa apartament cu o odaie). Determinaţi constructorii, metodele de acces.
Determinaţi clasa derivată apartamente cu o odaie cu adresă (un câmp adăugător - adresa).
Determinaţi constructorii, destructorii şi fluxul de ieşire.
Varianta 15
a) De creat clasa garaj, care conţine suprafaţă. Determinaţi constructorii şi metodele de acces.
Creaţi clasa casa, care conţine o odaie şi o bucătarie (suprafaţa ei), şi garaj. Determinaţi clasa
derivată vilă (ca parametru adăugator – cantitatea de pamânt). Determinaţi constructorii,
destructorii şi fluxul de ieşire.

S-ar putea să vă placă și