QReferate - referate pentru educatia ta.
Referatele noastre - sursa ta de inspiratie! Referate oferite gratuit, lucrari si proiecte cu imagini si grafice. Fiecare referat, proiect sau comentariu il poti downloada rapid si il poti folosi pentru temele tale de acasa.



AdministratieAlimentatieArta culturaAsistenta socialaAstronomie
BiologieChimieComunicareConstructiiCosmetica
DesenDiverseDreptEconomieEngleza
FilozofieFizicaFrancezaGeografieGermana
InformaticaIstorieLatinaManagementMarketing
MatematicaMecanicaMedicinaPedagogiePsihologie
RomanaStiinte politiceTransporturiTurism
Esti aici: Qreferat » Referate informatica

Clase derivate. Mostenire.



Clase derivate. Mostenire.


  1. Clase derivate.
  2. Reutilizarea codului folosind membri obiecte ai claselor.
  3. Constructori si destructori  in clasele derivate.
  4. Controlul accesului la membrii clasei de baza.
  5. Ierarhii de clase.
  6. Clase virtuale.
  7. Functii virtuale.
  8. Destructori virtuali.
  9. Clase abstracte.
  10. Polimorfism.
  11. Probleme.

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:

trapez paralelogram dreptunghi patrat

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:

triunghi   dreptunghic dreptunghic-isoscel


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.

  1. Controlul accesului la membrii clasei de baza.

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;

class Sef : public Angajat ;

class Director : public Sef ;

O asemenea ierarhie se reprezinta de obicei printr-un arbore, dar in cazul mostenirii multiple apare un graf orientat aciclic.

Pentru a fi folosita ca baza, o clasa trebuie sa fie definita; simpla declarare a clasei este insuficienta.

Sa consideram o functie membru void afisare() const in clasa de baza, pe care o vom redefini in clasele derivate, avand aceeasi semnatura:


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

Pentru a crea o singura copie a clasei de baza in clasa derivata (prin mostenire multipla indirecta) se declara clasa de baza de tip virtual.

class CBInd CBInd

class CBDir1 : virtual public CBInd;

class CBDir2 : virtual public CBInd; CBDir1 CBDir2

class Der: public CBDir1, public CBDir2;


Der

  1. Functii virtuale.

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

class D : public B ;

void main();

class D : public B

Putem accesa functiile f() din clasa de baza B si din clasa derivata D prin intermediul unor obiecte din clasele de baza si derivata, sau a unor pointeri la clasa de baza si la clasa derivata.

void main()

Prin urmare, accesul la functia membru din clasa B sau D este dictat de tipul pointerului (cu un pointer din clasa B putem accesa numai functii din clasa B, chiar daca pointerul indica spre un obiect din clasa derivata).

O functie virtuala este declarata cu specificatorul virtual in clasa de baza si este redefinita in clasa derivata.

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:

class B

class D : public B

void main()

Concluzia este aceea ca accesul la functia membru , declarata virtuala in clasa de baza este dictat de tipul obiectului legat de pointerul prin care se apeleaza functia (cu un pointer din clasa B putem accesa functia din clasa D, daca pointerul indica spre un obiect din clasa derivata).

Nu pot fi declarate ca functii virtuale: constructorii, functiile membri statici, functiile friend si functiile nemembri.

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.

  1. Destructori virtuali.

Consideram situatia in care se elibereaza un obiect din clasa derivata, folosind un pointer din clasa de baza.

class B

class D

void main()

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:

class Conversie;   //ctor

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

virtual void Identif();


class Felina : public Animal ;

void Identif();


class Pisica : public Felina ;

void Identif();



#include <iostream.h>

#include <string.h>

void main()


  1. Probleme.

1.Consideram clasa Forma cu derivarea Forma Dreptunghi

Cerc

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:

trapez paralelogram dreptunghi patrat

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:

Functionar

date

nume

cnp

operatii:

Functionar()

Afisare()



Permanent Temporar

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:

triunghi dreptunghic dreptunghic-isoscel


isoscel echilateral

Nu se poate descarca referatul
Acest referat nu se poate descarca

E posibil sa te intereseze alte referate despre:


Copyright © 2024 - Toate drepturile rezervate QReferat.com Folositi referatele, proiectele sau lucrarile afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul referat pe baza referatelor de pe site.
{ Home } { Contact } { Termeni si conditii }