14.6. Virtual funksiyaların istifadəsi Aşağıdakı proqramda virtual funksiyaların istifadə olunması nümunəsi verilmişdir:
#include using namespace std;
class base
{
public:
void fun_1() { cout << "base-1\n"; }
virtual void fun_2() { cout << "base-2\n"; }
virtual void fun_3() { cout << "base-3\n"; }
virtual void fun_4() { cout << "base-4\n"; }
};
class derived : public base
{
public:
void fun_1() { cout << "derived-1\n"; }
void fun_2() { cout << "derived-2\n"; }
void fun_4(int x) { cout << "derived-4\n"; }
};
int main()
{
base *p;
derived obj1;
p = &obj1;
p->fun_1(); //virtual funksiya deyil
p->fun_2();//varisdəki virtual çağırılacaq
p->fun_3();//bazadakı virtual çağırılacaq
p->fun_4();//bazadakı virtual çağırılacaq
p->fun_4(5); //virtual funksiya deyil. p ilə istifadə oluna bilməz
}
Yuxarıda proqramda erkən və gec bağlanma adlanan (Late and Early Binding) konsepsiya nümayiş olunur.
fun_1() funksiyasının baza sinifdəki versiyası çağırılır. Çunki, o virtual funksiya deyil və p göstəricisi base tipli olduğuna görə bazadakı funksiya çağırılır;
fun_2() funksiyası varis sinifdə (derived) yenidən yazılmış (overridden) versiyası çağırılır. Çünki o virtual funksiyadır;
fun_3() funksiyası varis sinifdə yenidən yazılmadığına (non overridden) görə baza sinifdəki virtual funksiya çağırılır;
fun_4(int) funksiyasının varis sinifdəki prototipi baza sinifindəkindən (bazadakı parametrsizdir) fərqləndiyindən o, varis sinifin özəl funksiyasıdır və baza tipli göstərici ilə istifadə oluna bilməz. Bu səbəbdən fun_4() funksiyası varis sinifdə yenidən yazılmadığına (non overridden) görə baza sinifdəki virtual funksiya çağırılır;
Virtual funksiyaların istifadəsinə aşağıdkı qaydalar nəzərə alınmalıdır: 1.Virtual funksiyalar public sahədə elan olunmalıdırlar.
2.Virtual funksiyalar staticvə ya başqa sinifin friend funksiyası ola bilməzlər.
3. Proqramın işi zamanı polimorfizm əldə etmək üçün - baza sinif tipindən olan göstərici ilə virtual funksiyaları istifadə (müdaxilə) etmək lazımdır.
4.Baza və Varis siniflərdə virtual funksiyanın prototipi eyni olmalıdır ki, yenidən təyin olunma (overriding) mumkun olsun.
5.Virtual funksiyalar həmişə baza sinifdə təyin olunurlar və varis sinifdə yenidən təyin olunurlar (fərqli kodla).
6.Virtual funksiya varis sinifdə yenidən təyin olunmaya da bilər. Bu halda baza sinifdəki versiya istifadə olunacaq.
7. Sinifin virtual destruktoruola bilər, amma virtual konstruktoru ola bilməz.