CATEGORII DOCUMENTE |
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.
Cand o functie virtuala este mostenita, se mosteneste si natura sa virtuala. O functie ramane virtuala indiferent de cate ori este mostenita.
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.
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
O clasa care contine cel putin o functie virtuala pura se numeste abstracta.
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 |
Vizualizari: 1759
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved