Sunteți pe pagina 1din 4

LUCRARE DE LABORATOR NR.

5
LA DISCIPLINA PROGRAMAREA N LIMBAJUL C++
Tema:
Motenirea multipl
Scopul lucrrii:
Studierea regulilor de determinare a motenirii multiple;
Studierea avantajelor i neajunsurilor motenirii multiple;
Probleme legate de utilizarea motenirii multiple;
Studierea rezolvrii problemelor;

Noiuni de baz
Motivarea
Motenirea multipl, reprezint prin sine motenirea de la dou sau mai multe clase. Pentru
a nelege pentru ce ne trebuie motenirea multipl trebuie s ne amintim, c motenirea simpl
nu rezolv toate problemele, aa cum cteodat ne oblig s alegem dintre dou clase de baz
potrivite.
Este interesant prerea lui Buch referitor la acest mecanism: Motenirea multipl este ca
o paraut: de regul, nu ne trebuie, dar, cnd ntmpltor o s ne trebuiasc, o s ne par ru
dac nu o s fie la ndemn .
n aa fel, acest mecanism este foarte necesar. Dar, el nu se folosete n toate limbajele, dar
este realizat n C++. Ca de exemplu: trebuie de descris clasa Fereastra cu buton i denumire,
ns clasele Fereastra, Fereastra cu buton, Fereastra cu denumire, sunt deja create i reprezint
prin sine urmtoarea ierarhie.
Window

Button

Titled

Window

Window

Button
Titled
Window

Figura 1 Motenirea de la dou clase rude.


Ambele clase pot fi utilizate ca clas de baz, pentru noua, nc ne creat. n lipsa
motenirii multiple ar fi fost necesar de ales i de completat funcionalitile care nu ajung. Nu
numai c utilizatorul este pus n faa unei alegeri, completarea codului, prin sine contrazice
principiului de minimizare a codului i utilizarea lui repetat.
Motenirea multipl are loc i n via:
- Practicantul este student i colaborator vremelnic. El primete not pentru lucrul su, ca
student, i n acelai moment, execut funciile de colaborator, i posibil primete i
salariu.

Tehnicianul dentist este un lucrtor sanitar, aa cum a absolvit universitatea de


medicin, n acelai moment el execut sarcini mai mult specifice fierarilor sau
giuvaerilor.
- Ornitorincul hrnete copiii si cu lapte, ns depune ou.
- Aciunile reprezint hrtii, ori valori de pre.
- Clasa iostream motenete clasele: istream i ostream.
Drept ultimul exemplu nu este tocmai din via, i iari din programare.
Definirea
Motenirea multipl se declar n felul urmtor:
class Student{
public:
int mark;
...
};
class Worker{
public:
int salary;
};
class Practicant: public Student, public Worker{
};
void PutMark(Student& s, int mark){
s.mark = mark;
}
void PutSalary(Worker& w, int salary){
w. salary = salary;
}
void main(){
Practicant p;
PutMark(p,5);
PutSalary(p,200);
}

Din exemplu se vede, c clasa derivat import comportamentul ambelor clase de baz, aa
cum, , cu parametrii ambelor funcii globale, adic principiul de rmne
in vigoare! Desigur c, rmne n vigoare i posibilitatea de utilizare a formelor de motenire, se
poate de motenit deschis de la una i nchis de la alta.
Problemele
Ca i orice alt instrument puternic i frumos, motenirea multipl are neajunsurile sale,
care au devenit motivul de eliminare a motenirii multiple din multe limbaje moderne.
Problemele apar din motivul apariiei . Presupunem, c n ambele clase de
baz exist cmpuri cu unul i acelai nume.
class A{
public:
int x;
};
class B{
public:
int x;
};
class C: public A, public B{
};
void main(){
C c;

c.x = 10;

n aa fel clasa C conine dou variabile cu unul i acelai nume, aa cum se motenesc
ambele, deoarece pentru fiecare clasa de baz variabila poate s aib un sens propriu.
Compilatorul nu poate decide, crei din variabilele motenite sa-i atribuie valoarea nou. Aceiai
situaie are loc i cu funciile.
Rezolvarea acestei neechivalene const n utilizarea precizrii numelui variabilei. Numele
variabilelor pot coincide, dar numele claselor nu coincid. Aa c, pentru indicarea variabilei care
este utilizat trebuie de indicat clasa, de la care este motenit variabila:
c.A::x = 10;
c.B::x = 5;

Mai dificil este cnd clasele A i B sunt nrudite, adic provin de la aceleai clase, aa cum
este prezentat n figura 1, cu toate c poate exista un caz mai dificil. n aceast configurare exist
dou variabile identice, cu unul i acelai sens. Se pot deosebi, aa cum este prezentat mai sus.
Dar problema const n aceia, c ele i dup sens sunt identice, iar funciile definite n nivelul doi
al ierarhiei, vor lucra n propriile copiii ale variabilelor, care des duc la greeli semantice greu de
gsit. Mai mult ca att, n acest caz, constructorul clasei de baz este chemat de dou ori. Pentru
rezolvarea acestei probleme se utilizeaz ultima form de motenire: virtual.
class A{
public:
int x;
A(int x){this->x=x;}
};
class B: virtual public A{
public:
B(int x):A(x){}
};
class C: virtual public A{
public:
C(int x):A(x){}
};
class D: public B, public C{
public:
D(int x):A(x),B(x),C(x){}
}

Aa cum se vede clasele B i C trebuie ambele s moteneasc clasa A. Imediat se rezolv


problema despre existena a dou variabile identice. Mai mult ca att, n acest caz este necesar de
chemat constructorul clasei de baz manual, aa cum este artat n exemplu. Deoarece nu
ntotdeauna ierarhia este proiectat de un dezvoltator, i unele clase deja pot fi compilate, n
asemenea cazuri rezolvarea problemei este practice imposibil.
ntrebri de control:
1.
2.
3.
4.
5.
6.
7.

Care sunt avantajele motenirii multiple?


Care sunt problemele la realizarea motenirii multiple?
Clasificai problemele legate de motenirea multipl?
Cum se rezolv problemele legate de motenirea multipl?
De ce este necesar motenirea virtual?
Cum este realizat motenirea virtual?
Cum lucreaz constructorii la motenirea multipl i virtual?

Sarcina
Pentru toate variantele este necesar de creat dou programe, care ar ilustra ambele
exemple date mai sus de motenire multipl.
Varianta 1
a)
b)

S se creeze, o ierarhie de motenire: student, colaborator - practicant.


S se creeze, o ierarhie de motenire: om - student, colaborator - practicant.
Varianta 2

a)
b)

S se creeze, o ierarhie de motenire: mamifere, reptile ornitorinc.


S se creeze, o ierarhie de motenire: animale - mamifere, reptile ornitorinc.
Varianta 3

a)
b)

S se creeze, o ierarhie de motenire: televizor, dispozitiv digital monitor.


S se creeze, o ierarhie de motenire: dispozitiv electric - televizor, dispozitiv digital
monitor.
Varianta 4

a)
b)

S se creeze, o ierarhie de motenire: stilou, creion condei de ardezie.


S se creeze, o ierarhie de motenire: rechizite de birou - stilou, creion condei de ardezie.
Varianta 5

a)
b)

S se creeze, o ierarhie de motenire: iahta, motocicleta motocicleta de apa.


S se creeze, o ierarhie de motenire: transport - iahta, motociclet motocicleta de apa.
Varianta 6

a)
b)

S se creeze, o ierarhie de motenire: divan, pat divan-pat.


S se creeze, o ierarhie de motenire: mobil - divan, pat divan - pat.
Varianta 7

S se creeze, o ierarhie de motenire: transport aerian, transport de pasageri lainer Boing


747
b) S se creeze, o ierarhie de motenire: transport - transport aerian, transport de pasageri Boing 747
a)

Varianta 8
a)
b)

S se creeze, o ierarhie de motenire: undi, telescop undi telescopic.


S se creeze, o ierarhie de motenire: obiect - undi, telescop undi telescopic.
Varianta 9

a) S se creeze, o ierarhie de motenire: hrtie, valori aciuni.


b) S se creeze, o ierarhie de motenire: obiect - hrtie, valori aciuni.
Varianta 10
a)
b)

S se creeze, o ierarhie de motenire: vehicul, camion maina de teren.


S se creeze, o ierarhie de motenire: automobil - vehicul, camion main de teren.
Varianta 11

a)
b)

S se creeze, o ierarhie de motenire: carte, caiet caiet de notie.


S se creeze, o ierarhie de motenire: hrtie - carte, caiet caiet de notie.
Varianta 12

a)
b)

S se creeze, o ierarhie de motenire: avion, corabie elicopter de apa.


S se creeze, o ierarhie de motenire: transport - elicopter, corabie - elicopter de apa.

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