METODE VIRTUALE
Fie o clasa Baza care contine doua metode: MetodaB si MetodaC unde MetodaB apeleaza
MetodaC. O alta clasa Derivata o
mosteneste pe prima. La nivelul acestei clasa redefinim metoda MetodaC dar nu redefinim MetodaB. Prin intermediul unui obiect de
tip Derivata se apeleaza metoda MetodaB. Atunci MetodaC apelata va fi cea din clasa Baza.
Daca se doreste ca apelul sa determine executia metodei
MetodaC din clasa Derivata se realizeaza o selectie dinamica (in momentul
apelului, nu la compilare). Identificarea unei metode supradefinite, în
momentul execuției, se numește legare ulterioară, "late binding".
Pentru obtinerea acestui rezultat, cand se declara, in
cadrul clasei de baza, o metoda ce va fi redefinita va fi precedata de cuvantul
cheie virtual.
În cazul unei
funcții declarate virtuală în clasa de bază și redefinite în clasa derivată,
redefinirea metodei în clasa derivată are prioritate față de definirea ei din
clasa de bază. Astfel, o funcție virtuală declarată în clasa de bază actionează
ca un substitut pentru păstrarea
datelor care specifică o clasă generală de acțiuni și declară forma interfeței.
La prima
vedere, redefinirea unei funcții virtuale într-o clasă derivată pare similară
cu supraîncărcarea unei funcției obișnuite. Totuși, nu este așa, deoarece
prototipul unei metode virtuale redefinite trebuie să coincidă cu cel
specificat în clasa de bază. În cazul supraîncărcării unei funcții normale,
caracteristicile prototipurilor trebuie să difere (prin tipul returnat, numărul
și/sau tipul parametrilor).
In urmatorul exemplu metoda tip
este o metoda virtulala declarata in clasa de baza cs1 si redefinita in
clasa derivata cs2:
#include<iostream.h>
#include<conio.h>
class cs1
{public:
void apeleaza()
{tip();}
virtual void
tip()
{cout<<"mesaj de la
cs1!"<<endl;}
};
class cs2:public cs1
{public:
virtual void tip()
{cout<<"mesaj de la cs2!"<<endl;}
};
void main()
{clrscr();
cs1 o1;
cs2 o2;
o1.apeleaza();//mesaj de la cs1!
o2.apeleaza();//mesaj de la cs2!
getch();
}
Se observa ca apelul metodei apeleaza
prin obiectul o2 apeleaza va determina apelul functiei tip din clasa derivata.