QReferate - referate pentru educatia ta.
Cercetarile noastre - sursa ta de inspiratie! Te ajutam gratuit, documente cu imagini si grafice. Fiecare document 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 » Documente informatica

Polimorfism si functii virtuale



Polimorfism si functii virtuale


Functii virtuale


Functiile virtuale se folosesc pentru a inlocui o functie membru a unei clase de baza,

astfel incat aceasta sa functioneze corect atat in situatii statice cat si in situatii

dinamice.

O functie virtuala se declara prefixand prototipul sau cu cuvantul virtual.

Despre functiile virtuale trebuie facute urmatoarele observatii:




Daca o functie este declarata virtuala intr-o clasa de baza ea va fi virtuala pentru

toate clasele ulterioare derivate. Nu este necesar ca in clasele derivate sa se specifice

cuvantul cheie virtual.


Nu este necesar ca in clasele derivate sa se suprapuna o functie virtuala peste cea din

clasa de baza. In acest caz se folosesc functiile din clasa de baza.Astfel pot fi declarate

functii virtuale numai in clasa de baza fara a fi suprapuse in clasele derivate anticipand

o dezvoltare ulterioara a programului.


O functie virtuala nu poate fi declarata ca un membru static al unei clase.


Operatorul de rezolutie este mai puternic decat mecanismul de functie virtuala


O functie virtuala poate fi declarata friend de catre o alta clasa.



Un exemplu:


class C;

class A;

class B:public A;

class C


void A::raport(C& cobj)

void B::raport(C& cobj)

void main()


Se obtine:


Raport din B -1



In acest exemplu se apeleaza functia raport care suprapune functia virtuala din clasa de

baza.

* Spre deosebire de functiile supraincarcate care nu pot avea aceleasi tipuri de argumente

explicite, functiile virtuale trebuie sa aiba aceleasi tipuri de argumente si acelasi numar

de argumente. Este usor sa se comita erori legate de acest lucru cand se declara functii

virtuale.


Un exemplu:


class A


class B:public A


void main()

Rezultatul obtinut este 19 deoarece functia f nu este virtuala ci supraincarcata, deoarece

argumentul sau este de tip char in B, iar in A tipul unsigned char. Astfel, cand se apeleaza

f prin p se foloseste versiunea din A deoarece in B nu avem o versiune care sa inlocuiasca

functia virtuala.

Functiile virtuale se folosesc in urmatoarele situatii:

1) Cand se lucreaza cu tablouri de pointeri la obiecte eterogene.


Un exemplu:


class data_android


class intrus_android:public data_android


void main()


Clase abstracte


In proiectarea OOP, clasa de baza trebuie sa fie foarte generala. Toate detaliile sunt

in clasele derivate.Uneori este indicat sa se creeze o clasa de baza atat de generala,incat

sa nu fie folosita nici la crearea de obiecte, ci doar ca un cadru-suport de la care se

porneste in definirea obiectelor.

O clasa abstracta este o clasa care cuprinde cel putin o functie virtuala pura, folosind

sintaxa:


virtual tip nume_functie(arg) = 0


Exista 2 reguli ce trebuie respectate pentru clasele abstracte:

sa contina cel putin o functie virtual pura;

nu pot fi utilizate ca tip pentru un argument, ca tip de retur al unei functii, ca tip

al unei conversii explicite si, mai ales, ca tip al unui obiect.


Compilatorul nu permite crearea de obiecte din clasa abstracta, ci doar din clasele derivate

si doar cu conditia ca aceste clase derivate sa furnizeze corpuri pentru functiile virtuale

pure.

Functiile virtuale pure se mostenesc ca si functiile virtuale obisnuite.

Intr-o clasa abstracta o functie este obligata sa aiba definitie, doar daca este apelata

folosind operatorul de rezolutie pentru a o localiza.


Un exemplu:


class fruct

virtual void CeEste()=0;


class portocala:public fruct

void CeEste()


void main()


Se obtine:


constructor de baza

constructor din derivata

Numele este portocala


Probleme propuse:

1.Se prezinta in continuare descrierea unei ierarhii de clase:
Pe marginea unui bulevard se pot plasa urmatoarele elemente arhitectonice (caracterizate de elementele specificate):
- spatii verzi: indicativ, lista plantelor/arborilor ce se pot planta pe acel spatiu, dimensiuni;
- case: indicativ, cu/fara etaj, numar de camere, numarul maxim de persoane ce le poate adaposti, dimensiuni;
- blocuri: indicativ, numar de etaje, cu/fara magazine la parter, dimensiuni, inaltime;
- magazine: indicativ, dimensiuni, inaltime.
Sa se ofere functii pentru:
a) completarea tuturor zonelor de pe latura bulevardului (numarul de zone e dat la rulare);
b) modificarea unei zone
c) 'darimarea' continutului unei zone
d) parcurgerea 'bulevardului' si afisarea 'constructiilor'
Pentru aceasta ierarhie se cere sa se implementeze aceasta ierarhie folosind tehnica OOP a claselor abstracte (care inglobeaza tot ceea ce este comun intr-o ierahie) si tehnica metodelor virtuale: toate functiile care se pot modifica pe nivelele 'inferioare' ale ierarhiei sint virtuale.
2.Sa se realizeze o ierarhie de clase care descrie multimea elementelor din plan intalnite in geometrie. Se considera clasa de baza CPunct , din ea se deriveaza clasa CDreapta , clasa CCerc , clasa CDreptunghi , clasa CPatrat .Pentru clasele CCerc,CDreptunghi si CPatrat sa se implementeze o functie de calcul a ariei si o functie pentru calculul perimetrului, functii ce vor fi declarate ca functii virtuale in clasa de baza.
3.Sa se construiasca o ierarhie de clase care descrie rasele de caini.Se considera clasa de baza Caine , din ea se deriveaza clasa CaineCuPete , clasa CaineFaraPete . Despre un caine se cunosc : numele, inaltime, greutate, varsta, culoare.Despre cainii cu pete se stie si numarul de pete. Sa se defineasca pentru fiecare clasa o functie de citire a datelor, respectiv una de afisare; ambele functii vor fi functii virtuale.
4.Sa se construiasca o ierarhie de clase care sa simuleze functionarea unei retele de calculatoare. Reteaua admite maxim 10 utilizatori si furnizeaza protectie prin parola si functii pentru conectare si deconectare. Reteaua este gestionata de un administrator.Pentru fiecare utilizator se cunoaste parola si numele. Administratorul este la randul sau tot un utilizator care are anumite facilitati in plus : poate vizualiza toti utilizatorii retelei, poate deconecta unul sau mai multi utilizatori , poate schimba setul de comenzi functionale.
Sa se realizeze clasa CRetea care va avea un nume, un numar de maxim 11 utilizatori din care unul singur poate fi administrator.

5.Sa se realizeze o ierarhie de clase care descrie habitatul animalelor dintr-o rezervatie naturala. In rezervatie pot fi intalnite urmatoarele animale :iepuri,ursi,caprioare,vulpi si lei.Unele dintre animale sunt ierbivore,alte carnivore sau chiar ierbivore si carnivore.Ierarhia de clase va avea clasa de baza CAnimal, clasa abstracta, din care se vor deriva doua clase : CAnimalIerbivor si CAnimalCarnivor. Pentru fiecare tip de animal vom avea o clasa corespunzatoare care se va extinde din una din clase de mai sus, sau din ambele, corespunzator modului de hranire a animalului.
Despre un animal se cunosc urmatoarele informatii comune : nume, data aducerii,greutate,hrana preferata, cantitate pe zi. In plus despre iepure se cunoaste suprafata minima pe care poate trai;despre vulpe - temperatura maxima de trai, tip (polara, indigena); despre leu - temperatura minima suportata, tara de provenienta;despre urs - perioada de hibernare; despre caprioara - numarul de pui. Pentru fiecare clasa se vor implementa atat o functie de citire a datelor , cat si o functie de scriere a acestora, functii ce vor fi declarate ca functii pur virtuale in clasa de baza CAnimal. Sa se construiasca o clasa CRezervatie care va contine o multime de animale.Sa se populeze rezervatia.
6.Se prezinta in continuare descrierea unei ierarhii de clase:
Clasele sociale din istorie pot fi caracterizate prin urmatoarele elemente definitorii:
- sclav = nume, nume stapin
- stapin = nume, numar de sclavi
- iobag = nume, nume stapin, venit anual
- feudal = nume, suprafata de pamint detinuta, titlu
- proletar = nume, salariu lunar
- capitalist = nume, numar de fabrici detinute
O 'carte de istorie' poate fi considerata ca o 'lista' de astfel de categorii/persoane.Fiecare clasa sociala are propriul 'salut'. Sa se afiseze saluturile tuturor persoanelor dintr-o 'carte de istorie' de la un moment dat.
Pentru aceasta ierarhie se cere:
1. Sa se implementeze aceasta ierarhie folosind tehnica OOP a claselor abstracte (care inglobeaza tot ceea ce este comun intr-o ierahie) si tehnica metodelor virtuale: toate functiile care se pot modifica pe nivelele 'inferioare' ale ierarhiei sint virtuale.
2. Fiecarei clase sa i se ofere constructori, destructori si functii specifice, corespunzatoare.
3. Prelucrarea obiectelor din aceasta ierarhie in mod uniform se poate face prin tehnica 'listelor eterogene': intr-o structura tip lista (tablou, lista simplu/dublu inlantuita, arbore,) se pastreaza pointeri la obiectul abstract cel mai 'inalt' din ierarhie si prin regulile de compatibilitate dintre clase in acei pointeri se pot 'agata' orice fel de obiecte din ierarhie. Sa se implementeze aceasta tehnica pentru ierarhia anterioara folosind un tablou (sau matrice) de pointeri;
4. Se vor oferi functii virtuale pentru citirea datelor caracteristice obiectelor si introducerea lor in 'lista', pentru parcurgerea listei si 'raportarea' specifica a prezentei in lista pentru fiecare obiect in parte.


Nu se poate descarca referatul
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 }