14.4. Baza və varis siniflərə olan göstəricilər Baza sinif tipindən olan göstəricinin varis sinif obyektinin ünvanını özündə saxlaması -dinamik polimorfizmin fundamentidir. Baza və törəmə siniflərdə işlədilən göztəricilərin işi digər tiplərə olan göstəricilərin işindən bir az fərqlənir. Bilirik ki, int, char , float və s. tipindən olan göstərici digər tipdən olan dəyişənin ünvanına malik ola bilməz. Lakin C++ da baza sinifdən olan göstərici bu sinifin varisləri olan obyektlərə də göstərici ola bilər.
Göstəricidən aşağıdakı sxem üzrə istifadə olunur:
Baza_sinif *р; // Baza_sinif tipli obyektə göstərici.
Baza_sinif B_ob; // Baza_sinif tipli obyekt.
Varis_sinif V_ob; // Varis_sinif tipli obyekt.
р = &B_ob; // рgöstəricisi Baza_sinif tipli obyekti göstərir.
р = &V_ob; // р göstəricisi indi Varis_sinif tipli obyekti göstərir.
Məsələn təsəvvür edin ki bizdə Müəlliflər adlı baza sinifimiz və Nəşrlər adlı varis sinifimiz var. Müəlliflər sinifinə göstərici təyin etsək bu göstərici ilə Nəşrlər sinifinin də göstərici ola bilər. Belə ki, bu göstərici ilə nəşrlər sinifinin varisi olduğu bütün üzvlərə müraciət edə bilərik.
Bu göstərici ilə Nəşrlər sinifinin özəl üzvlərinə müraciət etmək olmaz!
Proqram kodunda yuxarıda qeyd olunanları şərh edək :
#include #include using namespace std;
class Muellif {
char muellif[80];
public:
void put_muellif(char *s) { strcpy_s(muellif, s); }
void show_muellif() { cout << muellif << "\n"; }
};
class Neshr : public Muellif {
char neshr[80];
public:
void put_neshr(char *n) { strcpy_s(neshr, n); }
void show_neshr() {
cout << "Nesr: ";
cout << neshr << "\n";
}
};
int main()
{
Muellif *p;
Muellif M_ob;
Neshr *Np;
Neshr N_ob;
p = &M_ob; // Baza sinifinin ünvanını
// Muellif sinifinə göstərici ilə müdaxilə:
p->put_muellif("Abbas Sehhet");
// Neshr sinifinə “baza” göstəricisi ile is:
p = &N_ob;
p->put_muellif("Ali Bey Huseynzade");
// Göstərək ki hər bir müəllif öz sinif obyektinə aiddir:
M_ob.show_muellif();
N_ob.show_muellif();
cout << "\n";
/* put_neshr() və show_neshr() baza sinifinə aid olmadıqlarına görə, onlar p “baza” göstəricisi ilə müdaxilə oluna bilmirlər. Onlara birbaşa və ya öz tiplərindən olan göstərici ilə mürtaciət(müdaxilə)etmək olar.
*/
Np = &N_ob;
Np ->put_neshr("Veten");
p->show_muellif(); // Burada p və ya dp istifadə oluna bilər.
Np ->show_neshr();
return 0;
}
Baza tipli göstəriciyə varis obyektin ünvanını mənimsətmək mümkün olduğu halda, varis tipli göstəriciyə baza sinifi “göstərmək” (yəni baza sinifdən olan obyektin ünvanını mənimsətmək) olmaz.
Göstəricinin inkrement və dekrement əməli baza sinifinə nəzərən aparılır. Deməli əgər baza göstəricisi törəmə sinifi “göstərirsə” ünvanlanıbsa, bu əməliyyatlar(++,--) korrekt işləməyəcək.
Göstəricilər kimi istinadlar da eyni qayda ilə işləmək olar. Bu imkandan adətən arqumentləri funksiyaya ötürərkən istifadə olunur.
14.5. Virtual funksiyalar. C++ da dinamik pilimorfizm varislik və virtual funksiyalarla vasitəsi ilə mümkündür. Polimorfizm -eyni adlı funksiyanın müxtəlif realizasiyaları ilə oxşar proseslərin təsviri kimi başa düşülür. Bəzən polimorfizm “vahid interfeys, müxtəlif metodlar” ifadəsi ilə xarakterizə olunur. Bu o deməkdir ki, ümumi sinifdə təyin olunmuş eyni bir funksiya ilə fərqli (varis sinifin)obyektlərin fərqli əməliyyatlarını yerinə yetirmək mümkün olur.
C++ da iki tip polimorfizm mövcuddur:
1. Bunlardan biri bizə məlum olan operator və funksiyaların yüklənməsidən əmələ gəlir ki, buna kompilyasiya zamanı polimorfizm (compile time polymorphism) və ya statik polimorfizm deyilir. Yəni hansı yüklənmiş funksiyanin çağırılacağı kompilyasiyada artıq məlumdur. Bu tip polimorfizm bir çox məsələlərin həllində geniş imkanlar açmasına baxmayaraq OYP-nin bütün məsələlərini əhatə etmir.
2. C++ da varislik və virtual funksiyalar ilə realizə olunan və icra zamanı polymorfizm (run time polymorphism) adlan ikinci tip polimorfizm mövcuddur. Proqramın işi zamanı baş verən bu polimorfizm həmçinin dinamik polimorfizm (dynamic polymorphism) də adlanır. Bu halda kompilyasiya zamanı hansı funksiyanın çağırılacağı əvvəlcədən bəlli olmur. Proqramın icrası zamanı göstəricinin göstərdiyi funksiya çağırılır. Aşağıda polimorfizmin ümumi sxemi verilmişdir: