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.