Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Functii virtuale si polimorfism

c



+ Font mai mare | - Font mai mic



Functii virtuale si polimorfism

O functie virtuala este o functie care este declarata ca fiind virutal in clasa de baza si redefinita de o clasa derivata. In esenta, o functie virtuala declarata in clasa de baza actioneaza ca un substitut pentru pastrarea datelor care specifica o clasa generala de actiunii si declara forma interfetei. Redefinirea unui funtii virtuale intr-o clasa derivata ofera operatiile efective pe care le executa functia. Altfel spus, o functie virtuala defineste o clasa generala de actiuni. Redefinirea ei introduce o metoda specifica.



Cand sunt utilizate "normal", functiile virtuale se comporta exact ca oricare alta functie membru al clasei. Insa, ceea ce le face importante si capabile sa admita polimorfismul este modul in care se comporta cand sunt apelate printr-un pointer. Un pointer al clasei de baza poate fi folosit pentru a indica spre orice clasa derivata din acea baza. cand un astfel de pointer indica spre un obiect derivat care contine o functie virtuala, C++ determina care dintre versiunile functiei sa fie apelata, in functie de tipul obiectului spre care indica acel pointer. Astfel, cand sunt indicate obiecte diferite, sunt executate diferite versiuni ale functiei virtuale.

#include<iostream.h>

class BAZA

class DERIVAT_1 public BAZA

class DERIVAT_2 public BAZA

void main

Versiunea de virtual_function() ce se va executa este stabilita de tipul de obiect spre care indica p iar determinarea aceasta are loc in timpul rularii.

Desi puteti apela o functie virtuala in modul "obisnuit"

d2.virtual_function(); //apeleaza virtual_function() din DERIVAT_2

polimorfismul din timpul rularii este permis doar daca accesul se face print-un pointer al clasei de baza. Desigur, forma de mai sus nu este gresita, dar nu profitati de natura virtuala a clasei de baza.

ATENTIE: prototipul pentru o functie difera de surpaincarcarea unui functii normale, pentru care tipurile returnate si numarul si tipul parametrilor pot sa difere. Cand este redefinta o functie virtuala, toate caracteristicile prototipului sau trebuie sa fie aceleasi. Daca modificati prototipul atunci cand incercati sa redefiniti o functie virtuala, compilatorul de C++ o va considera o simpla functie supraincarcata, iar natura sa virtuala se va pierde.

RESTRICTIE: functiile virtuale nu trebuie sa fie membri de tip static ai clasei din care fac parte. De asemenea, ele nu pot fi friend. In sfarsit, functiile constructor nu pot fi virtuale, in schimb cele destructor pot fi.

N.B. O clasa care include o functie virtuala este numita o clasa polimorfica.

Atributul virtual este mostenit

Cand o functie virtuala este mostenita, se mosteneste si natura sa virtuala. O functie ramane virtuala indiferent de cate ori este mostenita.

Functiile virtuale sunt ierarhizate

Cand o functie este declarata ca fiind virtual intr-o clasa de baza, ea poate fi suprascrisa de o clasa derivata. Totusi, functia nu trebuie neaparat sa fie suprascrisa. Daca o clasa derivata nu suprascrie functia virtuala, atunci, cand un obiect din acea clasa derivata are acces la functie, este folosita functia definita de clasa de baza.

#include<iostream.h>

class B

class D1 public B

class D2 public B

void main

N.B. Atunci cand o clasa derivata nu suprascrie o functie virtuala, este folosita prima redefinire gasita in ordinea inversa a derivarii.

Functii virtuale pure

O functie virtuala pura este o functie virtuala care nu are definitie in clasa de baza.

virtual tip nume-functie(lista-de-parametri)

Cand o functie virtuala este construita pura, orice clasa derivata trebuie sa-i asigure o definitie. In cazul in care clasa derivata nu suprascrie functia virtuala pura, va rezulta o eroare in timpul compilarii.

#include<iostream h>

class NUMAR

virtual void arata //functie virtuala pura

class HEX public NUMAR

class DEC public NUMAR

class OCT public NUMAR

void main

Clase abstracte

O clasa care contine cel putin o functie virtuala pura se numeste abstracta.

Utilizarea functiilor virtuale

Una dintre cele mai puternice si mai flexibile cai de introducere a abordarii "o interfata, metode multiple" este folosirea functiilor virtuale, a claselor abstracte si a polimorfismului din timpul rularii. Folosind aceste caracteristici, creati o ierarhizare care trece de la general la specific (de la baza la derivat).

#include<iostream.h>

class CONVERT

double daconv

double dainit

virtual void calcul

class LITRI_GALOANE public CONVERT

void calcul

class FAHRENHEIT_CELSIUS public CONVERT

void calcul

void main



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1772
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved