72
Bu misolda avlod sinfi obyektiga adres qiymat sifatida berilgan ajdod sinf
turidagi ko‘rsatkich yoki ilova orqali avlodda qo‘shimcha yuklangan usulni
chaqirishga e’tibor berish lozim. Agar funksiya novirtual bo‘lsa ajdod sinf usuli,
virtual bo‘lsa avlod sinf usuli chaqiriladi.
SHunday qilib ajdod sinf turidagi ko‘rsatkich orqali virtual usul chaqirish
natijasi shu ko‘rsatkich qiymati ya’ni chaqiriq bajarilayotgan obyekt turi bilan
aniqlanadi.
Qaysi virtual funksiyani chaqirish ko‘rsatkich turiga emas shu ko‘rsatkich
qaratilgan(dastur bajarilish jarayonida) obyekt turiga bog‘liq.
Hech bo‘lmasa bitta sof (bo‘sh) virtual funksiyaga ega bo‘lgan sinf abstrakt sinf
deyiladi. Quyidagi tavsifga ega bo‘lgan komponentali funksiya sof virtual funksiya
deyiladi:
virtual
() = 0;
Sof virtual funksiya xech narsa qilmaydi va uni chaqirib bo‘lmaydi. Uning
qo‘llanilishi – xosila sinflarda uning o‘rnini egallovchi funksiyalar uchun asos
bo‘lish. Abstrakt sinf esa xosila sinf uchun asosiy (bazaviy) sinf sifatida ishlatilishi
mumkin.
Abstrakt sinflarning mexanizmi keyinchalik konkretizatsiyalanadigan umumiy
tushunchalarni tavsiflash uchun ishlab chiqilgan. Bu holda, sinflar iyerarxiyasini
yaratish quyidagi sxema bo‘yicha bajariladi.
Ierarxiya asosida abstrakt bazoviy sinf turadi. U interfeysni meros kilib olish uchun
foydalaniladi. Хosila sinflar bu interfeysni konkretizatsiyalaydi va amalga oshiradi.
Abstrakt sinfda sof virtual funksiyalar elon etilgan, ular aslida abstrakt usullar.
Ba’zi sinflar masalan shape sinfi, abstrakt tushunchalarni ifodalaydi va ular
uchun obyekt yaratib bo‘lmaydi. Bunday sinflar biror xoila sinfda ma’noga ega
bzladm:
class shape {
// ...
public:
virtual void rotate(int) = 0; // sof virtual funksiya
73
virtual void draw() = 0; // sof virtual funksiya
};
Abstrakt sinfni faqat boshqa sinf ajdodi sifatida ishlatish mumkin:
class circle : public shape { int radius;
public:
void rotate(int) { }
// qayta ta’riflash shape::rotate
void draw();
// qayta ta’riflash shape::draw
circle(point p, int r);
};
Agar sof virtual funksiya xosila sinfda to‘liq ta’riflanmasa, u xosila sinfda xm
sof virtual bo‘lib qoladi, natijada xosila sinf ham abstrakt sinf bo‘ladi.
Abstrakt sinflar realizatsiya detallarini aniqlashtirmasdan faqat interfeysni
ko‘rsatish uchun ishlatiladi. Masalan operatsion tizimda qurilma drayveri abstrakt
sinf sifatida berilishi mumkin:
class character_device {
public:
virtual int open() = 0; virtual int close(const char*) = 0;
virtual int read(const char*, int) =0; virtual int write(const char*, int) = 0;
virtual int ioctl(int ...) = 0;
// ...
};
Drayverlar character_device sinfining ajdodlari sifatida kiritilishi mumkin.
Dostları ilə paylaş: