Administratie | Alimentatie | Arta cultura | Asistenta sociala | Astronomie |
Biologie | Chimie | Comunicare | Constructii | Cosmetica |
Desen | Diverse | Drept | Economie | Engleza |
Filozofie | Fizica | Franceza | Geografie | Germana |
Informatica | Istorie | Latina | Management | Marketing |
Matematica | Mecanica | Medicina | Pedagogie | Psihologie |
Romana | Stiinte politice | Transporturi | Turism |
Clase derivate. Mostenire.
1. Clase derivate.
Prin mostenire, atributele unei clase de baza sunt transmise unor clase derivate. Derivarea permite definirea unor clase noi, prin adaugarea unor functionalitati noi unor clase deja existente, fara reprogramare sau recompilare.
Clasa derivata mosteneste caracteristicile unei clase de baza (sau mai multor clase de baza, in cadrul mostenirii multiple), la care adauga caracteristici noi, specifice.
Clasa derivata mosteneste datele membri si functiile membri din clasa de baza, exceptand constructorii, destructorii si operatorul de atribuire.
Exemplu de derivare:
romb
Reutilizarea codului se poate realiza in doua moduri:
prin compunere - incluzand obiecte in cadrul altor obiecte
prin mostenire - creind obiecte noi din cele existente
Sintaxa specificarii unei clase derivate este:
class nume_clasa_derivata : specif_acces nume_clasa_baza
In cazul mostenirii multiple este posibila mostenirea din mai multe clase de baza:
class derivata : acces1 baza1, , accesn bazan
O baza directa este mentionata in lista claselor de baza ale clasei derivate.
Prin mostenire multipla si indirecta se creaza ierarhii de clase, care sunt grafuri orientate aciclice (in cazul mostenirii simple avem un arbore orientat).
Exemplu de mostenire multipla:
isoscel echilateral
2. Reutilizarea codului folosind membri obiecte ai claselor.
Sa consideram clasele String si Persoana definite dupa cum urmeaza:
class String
class Persoana ;
Numele persoanei poate fi definit printr-un obiect de tip String, care poate apare ca membru al clasei Persoana
class Persoana ;
Fiecare obiect din clasa Persoana apeleaza doi constructori: Persoana si String. Constructorii din clasele membri se apeleaza inaintea constructorului clasei ce contine membrii deci ordinea de apel a constructorilor va fi: String si apoi Persoana
Argumentele se transmit constructorilor claselor membri printr-o lista de initializare a membrilor plasata imediat dupa antetul constructorului. Membrii initializati sunt separati intre ei prin virgule si precedati de :
Persoana:: Persoana(const String& n, int v)
: nume(n), varsta(v) ; // nu mai trebuie facut nimic
Lista de initializare a membrilor este singurul mecanism prin care pot fi initializati membrii care nu au constructori impliciti, membrii constanti si membrii referinte, deoarece in momentul inceperii executiei constructorului, acestia trebuie sa fie deja initializati.
Obiectul membru al clasei trebuie sa apara in lista de initializare, daca constructorul are lista de parametri.
class Club
Club::Club(const String& n, Data d)
:nume(n), membri(),creere(d) //lista de initializare
Constructorii membrilor sunt apelati in ordinea in care sunt declarati in clasa, nu in cea in care apar in lista de initializare. Destructorii sunt apelati in ordine inversa constructorilor.
Daca constructorii membrilor nu au parametri, ei pot sa nu apara in lista de initializare a membrilor.
Constructori si destructori in clasele derivate.
Constructorii si destructorii sunt functii membri care nu se mostenesc, intrucat acestia poseda numele clasei.
La creerea si initializarea unui obiect intr-o clasa derivata se apeleaza implicit, mai intai constructorii claselor de baza (in ordinea in care apar in declaratia clasei derivate) si apoi constructorul clasei derivate.
La distrugerea unui obiect al clasei derivate, mai intai este apelat destructorul clasei derivate, si apoi destructorii claselor de baza, in ordinea inversa celei in care apar in declaratia clasei derivate.
Specificatorul de acces public asigura ca:
membrii public ai clasei de baza devin membri public ai clasei derivate
membrii protected ai clasei de baza devin membri protected ai clasei derivate
membrii private ai clasei de baza nu sunt accesibili in clasa derivata
Un membru protected al unei clase, mostenita ca public se comporta ca unul private, adica poate fi accesat numai de membrii clasei si de functiile friend din clasa de baza. In plus, este accesibil si functiilor membri si functiilor friend din clasa derivata, unde este tot protected. La o noua derivare va fi transmis tot ca protected. (Membrii private din clasa de baza sunt inaccesibili in clasa derivata). Un membru protected poate fi privit ca public in clasele derivate si ca private in celelalte clase.
La o mostenire cu acces de tip protected a clasei de baza, membrii public si protected din clasa de baza devin protected in clasa derivata.
La o mostenire cu acces de tip private a clasei de baza, membrii public si protected din clasa de baza devin private in clasa derivata, si la o noua derivare nu vor mai putea fi accesati.
Ierarhii de clase.
O clasa derivata poate fi la randul ei clasa de baza. De exemplu:
class Angajat
void Angajat::afisare()const ;
Angajat::Angajat(const String& n, double s)
: nume(n), salariu(s) ;
class Sef: public Angajat;
void Sef::afisare()const ;
Sef::Sef(const String& n, double s, int sec)
: Angajat(n,s), sectie(sec) ;
Clase virtuale.
Intr-o mostenire multipla, o clasa poate fi mostenita indirect de mai multe ori. De exemplu:
class CBInd
class CBDir1 : public CBInd ;
class CBDir2 : public CBInd ;
class Der: public CBDir1, public CBDir2 ;
CBInd CBInd Un obiect din clasa Der contine membrii clasei CBInd
de doua ori:
- prin clasa CBDir1 (CBDir1::CBInd)
CBDir1 CBDir2 - prin clasa CBDir2 (CBDir2::CBInd)
Accesul la un membru din clasa CBInd este ambiguu,
Der deci interzis.
Ambiguitatea poate fi rezolvata folosind operatorul de rezolutie:
Der d;
d.CBDir1::x=10; // x mostenit prin CBDir1
d.CBDir2::x=25; // x mostenit prin CBDir2
class CBInd CBInd
class CBDir1 : virtual public CBInd;
class CBDir2 : virtual public CBInd; CBDir1 CBDir2
class Der: public CBDir1, public CBDir2;
Der
O functie membru, definita in clasa de baza poate fi redefinita in clasa derivata cu aceeasi semnatura. Cele doua functii: cea din clasa de baza si cea din clasa derivata, desi au aceeasi semnatura au functionalitati diferite.
Daca functia din clasa derivata are o semnatura diferita, atunci ea va fi supraincarcata in clasa derivata, fiind mostenita si functia din clasa de baza.
Accesul la membrii clasei de baza si a clasei derivate se poate face prin pointeri la obiecte din clasa de baza si din clasa derivata.
Folosind pointeri din clasa de baza.putem accesa obiecte din acea clasa, cat si dintr-o clasa derivata, deoarece conversia unui pointer din clasa derivata intr-un pointer din clasa de baza se face implicit.
Conversia inversa (din clasa de baza in clasa derivata) nu este implicita. O incercare de conversie conduce la eroare, iar o fortare a conversiei, prin cast, desi este corecta sintactic, conduce la rezultate imprevizibile.
class B
void main();
Revenind asupra exemplului precedent, constatam ca putem selecta o functie virtuala redefinita in clasa derivata, folosind un pointer din clasa de baza legat la un obiect din clasa derivata:
Atributul virtual se mosteneste pe parcursul derivarii: daca o functie este declarata virtuala in clasa de baza, functia redefinita in clasa derivata isa pastreaza atributul virtual in mod implicit.
Consideram situatia in care se elibereaza un obiect din clasa derivata, folosind un pointer din clasa de baza.
class B
class D
Deoarece selectia functiei este dictata de tipul pointerului, se va sterge numai o parte din obiectul creat (cea mostenita din clasa de baza) si va exista memorie ocupata in mod inutil cu partea de date din clasa D
Daca se declaram destructorul virtual, selectia functiei este determinata de obiectul indicat de pointer, asadar se va sterge un obiect din clasa D
Clase abstracte.
De obicei, functiile declarate virtuale in clasa de baza nu au functionalitati deosebite in clasa de baza. Ele sunt prevazute in vederea redefinirii in clasele derivate. Astfel pot exista functii, care sa nu aiba nici o definitie in clasa de baza numite functii virtuale pure, pe care utilizatorul sa fie obligat sa le redefineasca in clasele derivate inainte de a le folosi.
O functie virtuala pura are semnatura:
virtual tip nume(lista_parametric)=0;
O clasa abstracta contine cel putin o functie virtuala pura. O clasa abstracta nu poate fi instantiata, adica nu se pot crea obiecte din acea clasa, deoarece functiile virtuale pure nu sunt definite, dar se pot crea pointeri si referinte la clase abstracte.
O clasa abstracta este folosita drept suport pentru construirea altor clase prin derivare.
O clasa derivata devine la randul ei clasa abstracta, daca unele din functiile virtuale pure raman neredefinite. Daca se redefinesc toate functiile virtuale pure, clasa derivata devine normala, si poate instantia obiecte.
Exemplu de folosire a unei clase abstracte:
double getin() const; //accesor
double getout()const;
virtual void conv()=0; //fctie virtuala pura
class FahrCels : public Conversie{
public:
FahrCels(double i) : Conversie(i);
void conv();
class InchCm : public Conversie{
public:
InchCm(double i) : Conversie(i);
void conv();
void main();
if(pb)
Polimorfism.
Polimorfismul reprezinta posibilitatea de a apela o aceeasi functie cu argumente - obiecte din clase diferite.
Polimorfismul de mostenire reprezinta apelarea unei functii din clasa derivata folosind un pointer din clasa de baza. Legarea dinamica determina functia apelata pe baza obiectului la care se refera pointerul din clasa de baza in momentul in care se face apelul.
Fiecare obiect care contine o functie virtuala poseda un tabel de adrese de functii virtuale declarate in clasa. La apelul unei functii virtuale, printr-un pointer sistemul la executie :
determina adresa tabelului de functii virtuale al clasei obiectului
determina adresa functiei corespunzatoare
apeleaza functia de la aceasta adresa
Polimorfismul de mostenire, introdus prin virtualitate este un polimorfism la nivel de executie, obtinut prin legarea intarziata (legare dinamica) a adresei functiei apelate. Programele rezultate sunt simple si flexibile, dar au timpi de executie mai mari.
Legarea timpurie (la compilare) se refera la apelare de functii cu adrese de apel cunoscute: functii membre nevirtuale, functii friend, functii si operatori supraincarcati, etc. Apelurile rezolvate la compilare au o eficienta ridicata la executie.
Consideram derivarea Animal Felina Pisica si clasele:
class Animal
1.Consideram clasa Forma cu derivarea Forma Dreptunghi
class Forma
class Dreptunghi : public Forma;
class Cerc : public Forma;
Definiti functiile din cele 3 clase.
2. Consideram derivarea Dreptunghi Paralelipiped Implementati constructori pentru clasele respective si functiile Arie() si Volum() pentru Dreptunghi se ia volumul 0.
3. Se considera ierarhia de clase:
romb
Toate figurile au doua laturi paralele cu axa Ox.
Datele membri sunt constituite din coordonatele celor 4 varfuri. Functiile membri contin in afara constructorilor, functii pentru calculul ariei si perimetrului.
O data membru - valid , are valoarea 1 daca figura respectiva este specificata corect. Constructorii verifica paralelismul laturilor.
Definiti si implementati ierarhia de clase.
4. Modificati programul de mai sus, considerand ca patrat are mostenire multipla,de la dreptunghi si romb.
5. Consideram derivarea:
date
nume
cnp
operatii:
Functionar()
Afisare()
date date:
salariu plataorara
operatii: nrorelucrate
Permanent() operatii:
Afisare() Temporar()
Afisare()
Functia Afisare() din clasa de baza tipareste nume si cnp, iar in clasele derivate se tipareste in plus salariul. Definiti si implementati aceste clase.
6. Definiti si implementati ierarhia de clase:
isoscel echilateral
Acest document nu se poate descarca
E posibil sa te intereseze alte documente despre: |
Copyright © 2024 - Toate drepturile rezervate QReferat.com | Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site. { Home } { Contact } { Termeni si conditii } |
Documente similare:
|
ComentariiCaracterizari
|
Cauta document |