Sunteți pe pagina 1din 21

Curs 8

¾ Relatia de derivare in C++ (avansat)


‰ierarhia RxR
‰mostenire multipla
‰tipuri de derivare
‰implementarea mostenirii utilizand derivarea
‰initializarea clasei de baza
‰ordinea de initializare sub derivare
‰copiere si atribuire sub derivare
‰conversii standard
¾ Clase de baza virtuale (partajarea clasei de baza)
¾ Derivare si parametrizare

Dorel Lucanu Programarea calculatoarelor (C++) 170


Ierarhia RxR

RxR
x
y

m odul()

PctPla n C omp le x RxRxR


z
conj()
transl()
operator +()
m utaLa() m odul()
operator * ()

PctSpatiu
transl()
m utaLa()

Dorel Lucanu Programarea calculatoarelor (C++) 171


Mostenire multipla

Complex
PctPlan
conj()
transl() operator +()
mutaLa() operator *()

PlanComplex

Dorel Lucanu Programarea calculatoarelor (C++) 172


Ierarhia RxR in C++

class RxR
{
//. . .
};
class PctPlan : public RxR
{
//. . .
};
class Complex : public RxR
{
//. . .
};

Dorel Lucanu Programarea calculatoarelor (C++) 173


Ierarhia RxR in C++ (continuare)

class RxRxR : public RxR


{
//. . .
};
class PlanComplex : public PctPlan, public Complex
{
//. . .
};
class PctSpatiu : public RxRxR
{
//. . .
};

Dorel Lucanu Programarea calculatoarelor (C++) 174


Derivare:: tipuri de derivare

¾ public
class clasaDerivata : public clasaBaza
{
// ...
}
Ö ce e public in clasa de baza ramine public in clasa derivata
Ö ce e protected in clasa de baza ramine protected in clasa derivata
¾ protejat
class clasaDerivata : protected clasaBaza
{
//...
}
Ö ce e public in clasa de baza devine protected in clasa derivata
Ö ce e protected in clasa de baza ramine protected in clasa derivata

Dorel Lucanu Programarea calculatoarelor (C++) 175


Derivare:: tipuri de derivare (continuare)

¾ privat
class clasaDerivata : private clasaBaza
{
//...
}
Öce e “public” in clasa de baza devine “private” in clasa derivata
Öce e “protected” in clasa de baza devine “private” in clasa
derivata
¾ nivele de protectie a membrilor
‰public: cunoscut de toata lumea
‰protected: cunoscut de clasa proprietara si de clasele
mostenitoare
‰private: cunoscut numai de clasa proprietara

Dorel Lucanu Programarea calculatoarelor (C++) 176


Derivare:: implementarea relatiei de mostenire

¾relatia de derivare in C++ ¾relatia de mostenire(POO)

public Parinte
Baza protected
private

public | protected | private


Copil

Derivata
Öproprietatile si metodele
clasei parinte sunt
mostenite de clasa copil
Dorel Lucanu Programarea calculatoarelor (C++) 177
Fixarea terminologiei

C++ POO
¾derivare ¾mostenire (inheritance)
¾generalizare/specializare

Dorel Lucanu Programarea calculatoarelor (C++) 178


Derivare:: initializarea clasei de baza

RxRxR(float un_x=0, \
float un_y=0, \
float un_z=0 \
) : RxR(un_x, un_y), z(un_z)
{
//...
}
Öo clasa de baza care nu declara constructor sau declara un
constructor fara argumente nu necesita initializarea explicita
Öconstructorii de baza sint invocati inaintea celor derivati

Dorel Lucanu Programarea calculatoarelor (C++) 179


Derivare::ordinea de initializare

RxR(float, float );
RxRxR(float, float, float);
PctSpatiu(float, float, float);
//...
PctSpatiu P(10,10,10);
// ordinea de apelare a constructorilor:
// x(10); y(10);
// RxR(); z(10)
// RxRxR()
// PctSpatiu()

Dorel Lucanu Programarea calculatoarelor (C++) 180


Derivare::ordinea de initializare (continuare)

¾ Regula:
Öconstructorii de baza (stramosii) in ordinea declararii lor in
ierarhie
Öconstructorii obiectelor membre in ordinea declararii
Öconstructorul clasei derivate

Dorel Lucanu Programarea calculatoarelor (C++) 181


Derivare::ordinea de copiere

PctSpatiu Q = P;
¾ se apeleaza constructorii in ordinea:
1. RxR(const RxR&);
2. RxRxR(const RxRxR&)
3. PctSpatiu(const PctSpatiu&)

RxR A;
A = P;
¾ se apeleaza operatorul de atribuire
RxR::operator =(const RxR&)
Ö Atentie la pointeri; in cazul acesta exista constructori
X(const X&) si X& X::operator=(const X&)
definiti expliciti.

Dorel Lucanu Programarea calculatoarelor (C++) 182


Derivare::ordinea de copiere (continuare)

ÖSe disting situatiile:

Clasa de Clasa Ordinea de apelare


baza derivata
implicit implicit ¾constr. definit de clasa de baza
explicit ¾constr. definit de clasa derivata

implicit explicit ¾constr. definit de clasa derivata

explicit explicit ¾revine constr. clasei derivate


responsabilitatea de a apela constr clasei de
baza

Dorel Lucanu Programarea calculatoarelor (C++) 183


Derivare:: conversii standard (cazul derivarii publice)

¾ un obiect derivat poate fi convertit implicit la un obiect public de


baza
¾ o adresa a unui obiect derivat poate fi convertita implicit la o
adresa publica a unui obiect de baza
¾ un pointer la un obiect derivat poate fi convertit implicit la un
pointer public la un obiect de baza
float distPlanXY(RxR p, RxR q) {/*...*/}
//...
PctPlan a,b;
d1 = distPlanXY(a, b);
PctSpatiu u,v;
d2 = distPlanXY(u, v);

Dorel Lucanu Programarea calculatoarelor (C++) 184


Clase de baza nepartajate

RxR RxR
x x
y y

modul() modul()

PctPlan Complex
PctPlan::x
PctPlan::y
Complex::x
PlanComplex Complex ::y
PctPlan::modul()
Complex ::modul()
Dorel Lucanu Programarea calculatoarelor (C++) 185
Clase de baza partajate

RxR
x
y

modul()

PctPlan Complex

RxR::x
PlanComplex RxR::y
RxR::modul()

Dorel Lucanu Programarea calculatoarelor (C++) 186


Clase de baza virtuale = partajarea claselor de baza

class PctPlan : virtual public RxR {...};


class Complex : virtual public RxR {...};
class PlanComplex : public PctPlan, public Complex
{
//...
};

PlanComplex::PlanComplex(float un_x, float un_y) :


PctPlan(un_x, un_y), Complex(un_x, un_y)
{
// nimic
}
Dorel Lucanu Programarea calculatoarelor (C++) 187
Derivare si parametrizare

E lt

L is t a

e lim in a D e L a K ()
c it e s t e ()
p a rc u rg e ()
lu n g ()

E lt E lt

L L in L L in O rd

in s e re a z a () i n s e r e a z a ()
e l i m i n a () e l i m i n a ()
p o z () p o z ()

Dorel Lucanu Programarea calculatoarelor (C++) 188


Derivare si parametrizare (continuare I)

template <class Elt> class Lista;


template <class Elt> class LLin;
template <class Elt> class LLinOrd;
template <class Elt> class NodLista
{
public:
friend class Lista<Elt>;
friend class LLin<Elt>;
friend class LLinOrd<Elt>;
private:
Elt elt;
NodLista *leg;
};

Dorel Lucanu Programarea calculatoarelor (C++) 189


Derivare si parametrizare (continuare II)

template <class Elt> class Lista


{
//...
};
template <class Elt>
class LLin : public Lista<Elt>
{
//...
};
template <class Elt>
class LLinOrd : public Lista<Elt>
{
//...
};
Dorel Lucanu Programarea calculatoarelor (C++) 190

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