Documente Academic
Documente Profesional
Documente Cultură
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
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){}
}
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)
a)
b)
a)
b)
a)
b)
a)
b)
a)
b)
Varianta 8
a)
b)
a)
b)
a)
b)