logo

Sinflar orasida munosabatlar.

Загружено в:

08.08.2023

Скачано:

0

Размер:

27.509765625 KB
Mavzu:   Sinflar orasida munosabatlar.
Reja:
1. Abstrakt sinflar.
2. Inkapsulyasiya, Vorislik ,     Polimorfizm tushunchalari.
3. Samarali inkapsulyasiyalash. 
4. Sodda vorislik. Ko’plikdagi vorislik. Polimorf usullar.
  Abstrakt sinf ta’rifi. Hech bo’lmasa bitta sof (bo’sh) virtual funksiyaga ega
bo’lgan sinf abstrakt sinf deyiladi.
Quyidagi e’longa ega bo’lgan komponentali funksiya sof virtual funksiya
deyiladi: 
virtual <tur> <funksiya_nomi>
(<formal_parametrlar_ro’yxati>) = 0;
Bu yozuvda « = 0» konstruksiya «sof spesifikator» deyiladi. Sof virtual funksiya 
ta’rifiga misol:
virtual void fpure (void) = 0;
Sof   virtual   funksiya   hech   narsa   qilmaydi   va   uni   chaqirib   bo’lmaydi.   Uning
qo’llanilishi   –   hosila   sinflarda   uning   o’rnini   egallovchi   funksiyalar   uchun   asos
bo’lish. Abstrakt sinf esa hosila sinf uchun asosiy (bazaviy) sinf sifatida ishlatilishi
mumkin.   Agar   sof   virtual   funksiya   hosila   sinfda   to’liq   ta’riflanmasa,   u   hosila
sinfda ham sof virtual bo’lib qoladi, natijada hosila sinf ham abstrakt sinf bo’ladi.
Abstrakt sinfni faqat boshqa sinf ajdodi sifatida ishlatish mumkin:
Ba’zi   sinflar   abstrakt   tushunchalarni   ifodalaydi   va   ular   uchun   ob’ekt   yaratib
bo’lmaydi. Bunday sinflar biror hosila sinfda ma’noga ega bo’ladi:masalan,
class Abstract
{
public:
virtual void draw() = 0;
};
class Derived : public Abstract
{
public:
void draw() { cout « "Salom.";}
};
int main( void )
{
Derived d; Abstract a;
return 0;
}
Agar sof virtual funksiya hosila sinfda to’liq ta’riflanmasa, u hosila sinfda 
ham sof virtual bo’lib qoladi, natijada hosila sinf ham abstrakt sinf bo’ladi.
class Abstract
{
    virtual int f() = 0;
virtual float g(float) = 0;
};
class Derived : class Abstract
{
int f();
};
int main (void)
{
Abstract a; //hato
Derived d; // hato
}
Abstrakt sinflar realizasiya detallarini aniqlashtirmasdan faqat interfeysni 
ko’rsatish uchun ishlatiladi. Masalan, operasion tizimda qurilma drayveri abstract 
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.Abstrakt   sinf   turidagi   o’zgaruvchi   yaratib   bo’lmaydi,   lekin   abstrakt   sinf
turidagi   ko’rsatkich   yaratish   mumkin.   Bu   ko’rsatkichga   abstrakt   sinf   abstract
bo’lmagan   turli   avlodlari   adresini   qiymat   sifatida   berib,  abstrakt   usulga   mos   turli
usullarni chaqirish mumkin.
2. Inkapsulyasiya, Vorislik ,     Polimorfizm tushunchalari.
Inkapsulyasiya
Inkapsulatsiyalash,   vorislik   va   polimorfizm   obyektga   mo'ljallangan
dasturlash (OMD) ning uchta bazaviy tushunchasi hisoblanadi.
Inkapsulyasiyalash   -   ma’lumotlarning   va   shu   ma’lumotlar   ustida   ish   olib
boradigan   kodlarning   bitta   ob’ektda   birlashtirilishi.   OMD   atamachiligida
ma’lumotlar   ob’ekt   ma’lumotlari   a’zolari   (data   members)   deb,   kodlar   ob’ektli
usullar yoki funksiya-a’zolari (methods, member functions) deb   ataladi.
Inkapsulyasiya   yordamida   berilganlarni   yashirish   ta’minlanadi.   Bu   juda
yaxshi   xarakteristika   bo’lib   foydalanuvchi   o’zi   ishlatayotgan   ob’ektning   ichki
ishlari   haqida   umuman   o’ylamaydi.   Haqiqatan   ham,   xolodilnikni   ishlatishda
refrijektorni   ishlash   prinsipini   bilish   shart   emas.   Yaxshi   ishlab   chiqilgan   dastur
ob’ektini   qo’llashda   uning   ichki   o’zgaruvchilarining   o’zaro   munosabati   haqida
qayg’urish zarur emas.
C++   tilida   inkapsulyasiya   prinsipi   sinf   deb   ataluvchi   nostandart
turlarni(foydalanuvchi turlarini) hosil qilish orqali himoya qilinadi.
Inkapsulatsiyalash   dasturni   qandaydir   monolit,   boiinmas   narsa   sifatida   olib
qaramay,   ko'plab   mustaqil   elementlarga   bo'lish   imkonini   beradi.   Har   bir   element
o'z funksiyalarini boshqa elementlardan   mustaqil ravishda bajara oladigan alohida
modul sifatida olib qaraladi.
Aynan   inkapsulatsiyalash   tufayli   mustaqillik   darajasi   ortadi,   chunki   ichki
detallar interfeys ortida yashiringan boiadi.
Vorislik Vorislik   mavjud   bo'lgan   sinfning   ta'rifi   asosidayoq   yangi   sinfni   yaratish|
imkonini   beradi.   Yangi   sinf   boshqasi   asosida   yaratilgach,   uning   ta'rifi   avtomatik
tarzda   mavjud   sinfning   barcha   xususiyatlari,   xulq-atvori   va   joriy   qilinishiga
vorislik   qiladi.   Awal   mavjud   bo’lgan   sinf   interfeysining   barcha   metodlari   va
xususiyatlari   avtomatik   tarzda   voris   interfeysida   paydo   bo'ladi.   Vorislik   voris
sinfida   biror   bir   jihatdan   to'g'ri   kelmagan   xulq-atvorni   awaldan   ko'ra   bilish
imkonini beradi.
Bunday   foydali   xususiyat   dasturiy   ta'minotni   talablarning   o'zgarishiga
moslashtirish   imkonini   beradi.   Agar   o'zgartirishlar   kiritishga   ehtiyoj   tug'ilsa,   bu
holda   eski   sinf   funksiyalariga   vorislik   qiluvchi   yangi   sinf   yozib   qo'ya   qolinadi.
Keyin   o'zgartirilishi   lozim   boMgan   funksiyalarga   qaytadan   ta'rif   beriladi   hamda
yangi   funksiyalar   qo'shiladi.   Bunday   o'rniga   o'rin   qo'yishning   mazmuni   shundan
iboratki,   u   dastlabki   sinf   ta'rifini   o'zgartirmay   turib,   obyekt   ishini   o'zgartirish
imkonini beradi. 
Agar siz ko'p martalab qo'Uash yoki boshqa biron maqsadlarga ko'ra vorislikni
qo’llashga   ahd qilsangiz,  awal  har  gal   qarang —  merosxo'r—sinf  bilan  vorislikni
berayotgan sinfning turlari o'zaro mos keladimi? Vorislikda turlarning mos kelishi
ko'pincha «Is-a» testi deb ataladi. Ikkita sinf bir xil turga ega bo'lgandagina o'zaro
«Is-а» munosabatida turibdi deb hisoblanadi.
Vorislik   —   sinflar   o'rtasida   «Is-а»   munosabatlarini   o'rnatish   imkonini
beradigan   mexanizm.   Merosxo'r   sinf   o'z   ajdodi   bo’lgan   sinfdan   xususiyatlar   va
xulq-atvorni   meros   qilib   olayotganida,   u   shuningdek,   o'z   ajdodi   boMgan   sinf,
ehtimol, boshqa sinflardan meros qilib olgan xususiyatlar va xulq-atvorga ham ega
bo’ladi.
Vorislik   tabaqalanishi   qandaydir   ma'no   kasb   etishi   uchun   ajdodlar   ustidan
qanday amallar bajarilgan boMsa, avlodlar ustidan ham shunday amallar bajarilish
imkoniyati boMishi lozim. Bu «Is-а» testi yordamida tekshiriladi. Merosxo'r sinfga
funksiyalarni   kengaytirish   va   yangilarini   qo'shish   uchun   ruxsat   beriladi.   Ammo
unga funksiyalarni chiqarib tashlashga ruxsat yo'q. Vorislik   yordamida   qurilgan   sinf   metodlar   va   xususiyatlarning   uchta
ko'rinishiga ega bo’lishi mumkin:
—     O'rniga   qo'yish   (almashtirish):   yangi   sinf   ajdodlarining   metodi   yoki
xususiyatini shunchaki o'zlashtirib olmaydi, balki unga yangi ta'rif ham beradi.
—   Yangisini   qo'shish:   yangi   sinf   butunlay   yangi   metodlar   yoki   xususiyatlarni
qo'shadi.
—     Rekursiv:   yangi   sinf   o'z   ajdodlari   metodlari   yoki   xususiyatlarini   to'g'ridan-
to'g'ri olib qo'ya qoladi.
Vorislik turlari
Vorislik uch asosiy hollarda qo'llanadi:
1. Ko'p martalab foydalanishda.
2. Ajralib turish uchun.
3. Turlarni almashtirish uchun.
Vorislikning   ayrim   turlaridan   foydalanish   boshqalaridan   ko'ra   afzalroq
hisoblanadi.   Vorislik   yangi   sinfga   eski   sinfning   amalda   qo’llanishidan   ko'p
martalab  foydalanish  imkonini  beradi. Kodni  qirqib tashlash  yoki  kiritish  o'rniga,
vorislik kodga avtomatik tarzda kirishni  ta'minlaydi, ya'ni kodga kirishda u yangi
sinfning   bir   qismidek   olib   qaraladi.   Ko'p   martalab   qo'llash   uchun   vorislikdan
foydalanar ekansiz, siz meros qilib olingan realizatsiya (j°riy qilinish) bilan bog'liq
bo'lasiz.   Vorislikning   bu   turini   ehtiyotkorlik   bilan   qo'llash   lozim.   Yaxshisi   bu
o'rinda «Has-а» munosabatidan foydalanish kerak.
Farqlash   uchun   vorislik   faqat   avlod-sinf   va   ajdod-sinf   o'rtasidagi   farqlarni
dasturlash imkonini beradi. Farqlarni dasturlash g'oyat qudratli vositadir. Kodlash
hajmining   kichikligi   va   kodning   oson   boshqarilishi   loyiha   ishlanmasini
osonlashtiradi.   Bu   holda   kod   satrlarini   kamroq   yozishga   to'g'ri   keladiki,   bu
qo'shiladigan xatolar miqdorini ham kamaytiradi.
Potimorfizm
Agar   inkapsulatsiyalash   va   vorislikni   OMY   ning   foydali   vositalari   sifatida
olib   qarash   mumkin   bo'lsa,   polimorfizm   —   eng   universal   va   radikal   vositadir.
Polimorfizm  inkapsulatsiyalash  va vorislik bilan chambarchas bog'liq, boz ustiga, polimorfizmsiz OMY samarali bo'lolmaydi. Polimorfizm — OMY paradigmasida
markaziy   tushunchadir.   Polimorfizmni   egallamay   turib   OMY   dan   samarali
foydalanish mumkin emas.
Polimorfizm   shunday   holatki,   bunda   qandaydir   bitta   narsa   ko'p   shakllarga
ega   bo'ladi.   Dasturlash   tilida   «ко'р   shakllar»   deyilganda,   bitta   nom   avtomatik
mexanizm   tomonidan   tanlab   olingan   turli   kodlarning   nomidan   ish   ko'rishi
tushuniladi.   Shunday   qilib,   polimorfizm   yordamida   bitta   nom   turli   xulq-atvorni
bildirishi mumkin.
Vorislik   polimorfizmning   ayrim   turlaridan   foydalanish   uchun   zarur.Aynan
o'rindoshlik   imkoniyati   mavjud   bo'lgani   uchun   polimor   fizmdan   foydalanish
mumkin bo'ladi. Polimorfizm  yordamida tizimga to'g'ri kelgan paytda qo'shimcha
funksiyalarni qo'shish mumkin.
Dasturni   yozish   paytida   hatto   taxmin   qilinmagan   funksionallik   bilan   yangi
sinflarni   qo'shish   mumkin,   buning   ustiga   bularning   hammasini   dastlabki   dasturni
o'zgartirmay turib ham amalga oshirish mumkin.
Yangi talablarga osongina moslasha oladigan dasturiy vosita deganda mana
shular tushuniladi.
Polimorfizmning uchta asosiy turi mavjud:
— Qo'shilish polimorfizmi.
— Parametrik polimorfizm.
— Ortiqcha yuklanish.
Qo'shilish   polimorfizmini   ba'zida   sof   polimorfizm   deb   ham   ataydilar.
Qo'shilish   polimorfizmi   shuning   bilan   qiziqarliki,   u   tufayli   tarmoq   sinf   nusxalari
o'zini   turlicha   tutishi   mumkin.   Qo'shilish   polimorfizmidan   foydalanib,   yangi
tarmoq sinflarni kiritgan holdatizimning xulq-atvorini o'zgartirish mumkin. Uning
bosh   afzalligi   shundaki,   dastlabki   dasturni   o'zgartirmay   turib   yangi   xulq-atvorni
yaratish mumkin.
Polimorfizmdan   samarali   foydalanish   sari   qo'yilgan   birinchi   qadam   bu
inkapsulatsiyalash   va   vorislikdan   samarali   foydalanishdir.   Inkapsulatsiyalashsiz
dastur   osongina   sinflarning   joriy   qilinishiga   bog'liq   bo'lib   qolishi   mumkin.   Agar dastur   sinflarning   joriy   qilinish   aspektrlaridan   biriga   bog'liq   bo'lib   qolsa,   tarmoq
sinfda bu joriyni to'g'rilash mumkin bo'lmaydi.
3.Samarali inkapsulyasiyalash.
Mohiyatan   inkapsulatsiyalash   atamasi   «gcrmctik   berkitilgan;   tashqi
ta'sirlardan   himoyalangan   dastur   qismi»   degan   ma'noni   bildiradi.   Agar   biror   bir
dasturiy obyektga inkapsulatsiyalash qo'llangan boisa, u holda bu obyekt qora quti
sifatida   olib   qaraladi.   Siz   qora   quti   nima   qilayotganini   uning   tashqi   interfeysini
ko'rib turganingiz uchungina bilishingiz mumkin. Qora qutini biron narsa qilishga
majburlash   uchun   unga   xabar   yuborish   kerak.   Qora   quti   ichida   nima   sodir
bo'layotgani ahamiyatli emas, qora quti yuborilgan xabarga adekvat (mos ravishda)
munosabatda bo'lishi muhimroqdir.
Interfeys   tashqi   olam   bilan   tuzilgan   o'ziga   xos   bitim   bo'lib,   unda   tashqi
obyektlar   ushbu   obyektga   qanday   talablar   yuborishi   mumkinligi   ko'rsatilgan
bo'Iadi. Interfeys — ob’yektni boshqarish pulti.
Samarali inkapculyasiyalashning uchta o’ziga xoc belgici qo’yidagicha:
-abstraksiya;
-joriy qilishning berkitilganligi;
-ma’suliyatning bo’linganligi.
Abstraksiya.  Garchi ob’ektga mo’ljallangan tillar inkapsulyasiyalashdan
foydalanishga yordam bersa-da, biroq ular inkapsulyasiyalashni 
kafolatlamaydi.
Tobe va ishonchsiz kodni yaratib qo’yish oson. Samarali inkapsulyasiyalash
-sinchkovlik   bilan   ishlab   chiqish   hamda   abstraksiya   va   tajribadan   foydalanish
natijasi.   Inkapsulyasiyalashdan   samarali   foydalanish   uchun   dasturni   ishlab
chiqishda   avval   abstraksiyadan   va   uning   bilan   bog’liq   konsepsiyalardan
foydalanishni o’rganib olish lozim.
Abstraksiya   murakkab   masalani   soddalashtirish   jarayonidir.   Muayyan
masalani   yechishga   kirishar   ekansiz,   siz   barcha   detallarni   hisobga   olishga
urinmaysiz, balki yechimni osonlashtiradiganlarini tanlab olasiz. Abstraksiyaning   ikkita   afzal   jihati   bor.   Birinchidan,   u   masala   yechimini
soddalashtiradi.   Muhimi   shundaki,   abstraksiya   tufayli   dasturiy   ta’minot
komponentlaridan   takroran   foydalanish   mumkin.   Takroran   qo’llanadigan
komponentlarni   yaratishda   ular   odatda   g’oyat   ixtisoslashadi.   Ya’ni   komponentlar
biron-bir   ma’lum   masala   yechimiga   mo’ljallangani,   yana   ular   keraksiz   o’zaro
bog’liqlikda   bo’lgani   sababli   dastur   fragmentining   boshqa   biron   o’rinda   takroran
qo’llanishi qiyinlashadi. Imkoni boricha bir qator masalalarni yechishga qaratilgan
ob’ektlarni   yaratishga   harakat   qiling.   Abstraksiya   bitta   masala   yechimidan   ushbu
sohadagi boshqa masalalarni ham yechishda foydalanish imkonini beradi.
Samarali   abstraksiyani   bajarish   uchun   bir   nechta   qoidalarni   ifodalash
mumkin.
-   Qandaydir   aniq   holatni   emas,   umumiy   holatni   olib   qarang.
-   Turli   masalalarga   xos   bo’lgan   umumiy   jihatni   izlab   toping.   Shunchaki
alohida   xodisani   emas,   asosiy   tamoyilni   ko’ra   bilishga   harakat   qiling.
-   Garchi   abstraksiya   g’oyat   qimmatli   bo’lsa-da,   biroq   eng   yechimli   masalani
yodingizdan   chiqarmang.
-   Abstraksiya   hamma   vaqt   ham   ochiq-oydin   emas.   Masalani   yechar   ekansiz,
siz   birinchi,   ikkinchi   va   hatto,   uchinchi   martasiga   ham   abstraksiyani   tanib
ololmasligingiz   mumkin.
-   Muvaffaqiyatsizlikka   tayyor   turing.   Amalda   har   bir   vaziyat   uchun   to’g’ri
keladigan   abstrakt   dasturni   yozish   mumkin   emas.
Abstraksiyani   so’nggi   maqsad   sifatida   emas,   balki   unga   erishish   yo’lidagi
vosita   sifatida   olib   qarash   kerak.   Muayyan   xollarda   abstraksiyani   qo’llash   kerak
emas.   Yaxshigina   evristik   qoida   mavjud,   bo’lib,   unga   ko’ra,   agar   siz   biron   bir
masalani   o’zaro   o’xshash   usullar   bilan   kamida   uch   marta   yechgan   bo’lsangiz,
abstraksiyani faqat shunday masalalarga qo’llash tavsiya qilinadi.
Abstraksiya samarali inkapsulyasiyalashning tarkibiy qismlaridan biri xolos.
Tashqi ta’sirlardan mutlaqo himoyalanmagan abstrakt dasturni ham yozish
mumkin.   Aynan   shuning   uchun   ob’ektning   ichki   joriy   qilinishini   berkitish
kerak bo’ladi. Joriy qilishning berkitilganligi. Joriy qilishning berkitilganligi ikkita
afzallikka ega:
- ob’ektlarni foydalanuvchilardan himoyalaydi;
- foydalanuvchilarni ob’ektlardan himoyalaydi.
Birinchi afzallik - ob’ektlarni himoyalashni ko’rib chiqamiz.
Asl inkapsulyasiyalash til darajasida qurilma til konstruksiyalari yordamida
ta’minlanadi.
Ma’lumotlarning   abstrakt   turlari   -   bu   ma’lumotlar   va   ular   ustida
o’tkaziladigan operasiyalar to’plami.Ma’lumotlarning abstrakt turlari ichki axborot
va   holatni   puxta   ishlab   chiqilgan   interfeys   ortida   yashirar   ekan,   ular   tilda
ma’lumotlarning yangi turlarini aniqlashga imkon beradi.
Joriy   qilishning   berkitilganligi   dasturni   moslashuvchan   qiladi,   chunki
foydalanuvchilar ob’ektning joriy qilinishini hisobga olishga majbur emaslar.
Shunday qilib, joriy qilishning berkitilganligi nafaqat ob’ektni himoyalaydi,
balki   kuchsiz   bog’langan   kodni   yaratishga   yordam   berib,   ushbu   ob’ektdan
foydalanuvchilar uchun muayyan noqulayliklarni chetlab o’tish imkonini beradi.
Kuchsiz   bog’langan   kod   -   bu   boshqa   komponentlarning   joriy   qilinishiga
bog’liq bo’lmagan kod.
Ma’suliyatning   bo’linganligi.   Joriy   qilishning   berkitilganligi   ma’suliyat
tushunchasi   bilan   bog’liqligi   tabiiydir.   Kuchsiz   bog’langan   dasturni   yaratish
uchun,   ma’suliyatni   tegishli   ravishda   taqsimlash   ham   muhimdir.   Ma’suliyat
tegishli   ravishda   taqsimlanganda,   har   bir   ob’ekt   o’zi   ma’sul   bo’lgan   bitta
funksiyani   bajaradi   hamda   bu   funksiyani   yaxshi   bajaradi.   Bu   esa   ob’ekt   bir
butunlikni tashkil etishini ham bildiradi. Boshqacha qilib aytganda, funksiyalar va
o’zgaruvchilarning tasodifiy to’plamiga ehtiyoj bo’lmaydi.
Inkapsulyasiyalanayotgan   ob’ektlar   o’rtasida   yaqin   konseptual   aloqa
bo’lmog’i
kerak.   Barcha   funksiyalar   umumiy   vazifani   bajarmog’i   kerak.   Joriy   qilish
berkitilmas   ekan,   ma’suliyat   ob’ektdan   chetga   chiqib   ketishi   mumkin.   Biroq   o’z vazifasini   qanday   hal   qilishni   aynan   ob’ektning   o’zi   bilishi   lozim,   ya’ni   aynan
ob’ekt o’z vazifasini bajarish algoritmiga ega bo’lishi kerak.
Agar joriy qilish ochiq qoldirilsa, foydalanuvchi undan to’g’ridan-to’g’ri
foydalanishi va shuning bilan ma’suliyatni bo’lishi mumkin.Agar ikkita ob’ekt bir
xil   vazifani   bajarsa,   demak   ma’suliyat   tegishlicha   taqsimlanmagan   bo’ladi.
Dasturda   ortiqcha   mantiqiy   sxemalar   mavjud   bo’lsa,   uni   qayta   ishlash   lozim
bo’ladi.
Samarali inkapsulyasiyalash = abstraksiya + joriy qilishning berkitilganligi +
ma’suliyat.
4.Sodda vorislik. Ko’plikdagi vorislik. Polimorf usullar.
C++   tili   o’zining   barcha   ajdodlarining   xususiyatlari,   ma’lumotlari,   usullari
va voqealarini meros qilib oladigan hosila sinfini e’lon qilish imkoniyatini beradi.
Hosila   sinfda,   shuningdek   yangi   tavsiflarni   e’lon   qilish   hamda   meros   sifatida
olinayotgan ayrim funksiyalarni qo’shimcha yuklash mumkin.
Vorislik   asos   sinf   kodidan   hosila   sinf   nusxalarida   takroran   foydalanish
imkonini beradi.
Hosila   sinfni   e’lon   qilishning   umumlashgan   sintaksisini   ko’rib
chiqamiz.
Seksiyalarni sanab o’tish tartibi himoya imtiyozlarini eng cheklanganlaridan, to
eng ommaviylariga qarab kengayib borishiga mos keladi:
class className: [<kirish huquqini beruvchi spesifikator>] parent Class {
<Do’stona sinflarni e’lon qilish>
private:
<xususiy ma’lumotlar a’zolari>
<xususiy konstruktorlar>
<xususiy usullar>
protected:
<himoyalangan ma’lumotlar a’zolari>
<himoyalangan konstruktorlar>
<himoyalangan usullar> public:
<ommaviy xususiyatlar>
<ommaviy ma’lumotlar a’zolari>
<ommaviy konstruktorlar>
<ommaviy destruktor>
<ommaviy usullar>
Himoyalangan   (protected)   komponentalar   sinf   ichida   va   hosila   sinflarda
murojaat huquqiga ega.
Bazaviy   sinf   imkoniyatlarini   kengaytiradigan   sinflarni   yuzaga   keltirish   mumkin:
bu yo’l siz uchun g’oyat qulay, ammo ozgina ishlashni talab qilgan funksiyaga ega.
Hosila   sinfda   kerakli   funksiyani   yangidan   yaratish   vaqtni   bekorga   sarflash   bilan
barobar. Buning o’rniga bazaviy sinfda koddan takroran foydalanish kerak: bunda
u   talab   qilingan   darajada   kengaytirilishi   mumkin.   Hosila   sinfda   sizni
qoniqtirmaydigan bazaviy sinf funksiyasini qayta aniqlang xolos.
Xuddi   shunday   yo’l   bilan   bazaviy   sinf   imkoniyatlarini   cheklaydigan
sinflarni
yuzaga keltirish mumkin: Bu yo’l siz uchun g’oyat qulay, ammo nimanidir
ortiqcha qiladi.
Agar   asos   sinf   parametrli   konstruktorga   ega   bo’lsa   hosila   sinf   ham   albatta
parametrli   kontruktorga   ega   bo’lishi   shart   va   bu   konstruktor   inisializatorlar
ro’yxatida yoki tanasida asos sinf konstruktorini chaqirishi lozim. Masalan:
class Base
{
int a;
public:
Base(int a1): a(a1){}
};
class Derived : public Base
{
int b; public:
Derived(int a1, int b1) : Base(a1),b(b1){}
};
Bu misolda hosila sinf konstruktorida asos sinf konstruktori chaqiriladi 
so’ngra hosila sinf parametrlari inisializasiya qilinadi.
Ko’plikdagi vorislik
Ko’plik vorislik ta’rifi. Ko’plik vorislik deb sinf ta’rifida bir necha sinf asos
sinf sifatida ko’rsatish imkoniga aytiladi.
Masalan:
class Basis1
{ int a,b;
public:
Basis1(int x,int y){a = x;b = y;}
};
class Basis2
{ int c;
char*s;
public:
Basis2(int x,char*y){c = x; b = new char[strlen(y)+1];}
~Basis2(){delete[]s;}
};
class Inherit:public Basis1,public Basis2
{int sum;
public:
Inherit(int x,int y, int z, char*d, int k):Basis1(x,y),Basis2(z,d){sum = k;}
};
Polimorf usullar
Sinflarda   polimorfizm.   Polimorfizm   yuqorida   aytilganidek   yunoncha   so’z
bo’lib,   ikkita   o’zakdan   -   poli   (ko’p)   va   morfos   (shakl)   dan   iborat   hamda   ko’p
shakllilikni bildiradi. Polimorfizm - bu turdosh ob’ektlar (ya’ni bitta ajdod hosilasi bo’lgan sinflarga mansub ob’ektlar) ning dastur bajarilish vaqtida vaziyatga qarab,
o’zlarini   turlicha   tuta   olish   xususiyati.   Obyektga   mo’ljallangan   yondoshuv
doirasida   dasturchi   ob’ekt   xulq-atvoriga   faqat   bilvosita   ta’sir   ko’rsatishi,   ya’ni
dasturga   kiritilayotgan   usullarni   o’zgartirishi   hamda   avlodlarga   o’z   ajdodlarida
yo’q bo’lgan o’ziga xos xususiyatlarni qo’shishi mumkin.
Usulni   o’zgartirish   uchun   uni   avlodda   qo’shimcha   yuklash   kerak,   ya’ni
avlodda  bitta  nomdagi   usulni  e’lon  qilish  va  unda   kerakli  xatti-harakatlarni  ishga
solish   kerak.   Natijada   ajdod-ob’ekt   va   avlod-ob’ektda   bitta   nomdagi   ikkita   usul
amal   qiladi.   Bunda   ushbu   usullarning   kodlari   turlicha   ishga   tushiriladi   va,
demakki, ob’ektlar turlicha xatti-harakat ko’rsatadi.
Polimorfizm   tufayli,   avlodlar   bitta   voqeaga   o’ziga   xos   tarzda   munosabat
bildirish   uchun,   o’z   ajdodlarining   umumiy   usullarini   qo’shimcha   yuklashlari
mumkin.
C++da polimorf funksiya bitta nomdagi ehtimoliy funksiyalardan biriga faqat
bajarilish   paytida,   ya’ni   unga   sinfning   konkret   ob’ekti   uzatilayotgan   paytda
bog’lab   qo’yiladi.   Boshqacha   qilib   aytganda,   dastlabki   dastur   matnida
funksiyaning   chaqirilishi   faqat   tahminan   belgilanadi,   aynan   qanday   funksiya
chaqirilayotgani aniq ko’rsatilmaydi.
Navbatdagi misol oddiy a’zo-funksiyalarning polimorf bo’lmaganligi 
nimaga olib kelishi mumkinligini ko’rsatadi.
#include <iostream>
#include <string>
using namespace std;
class Parent
{
public:
void F1() { cout<<"I am Parent"<<endl; };
void F2(int n) {
for(int i = 0;i<n;i++) F1();
}; };
class Child : public Parent
{
public:
void F1() { cout<<"I am Parent"<<endl; }
};
int main() {
Child child;
child.F2(3);
int kk;cin>>kk;
return 0;
}
Natija:
I am Parent
I am Parent
I am Parent
Parent   sinfi   F1   va   F2   a’zo-funksiyalarga   ega,   bunda   F2   ni   F1   chaqiradi.   Parent
sinfining   hosilasi   bo’lgan   Child   sinfiga   F2   funksiyasi   vorislikka   o’tadi,   biroq   F1
funksiyasi   qayta   ta’riflanadi.   Kompilyator   vorislikka   o’tgan   F2   funksiyani
Parent::F1 funksiyasi bilan bog’lab translyasiya qilib yuboradi.
Parent va Child sinflari ob’ektlarida F1 funksiyasi polimorfligini ta’minlash
uchun,   uni   virtual   deb   e’lon   qilish   zarur.   Quyida   dasturning   modifikasiyalangan
matni keltiriladi:
#include<iostream.h>
class Parent
{
public:
virtual void F1() { cout<<”I am Parent<<endl; };
void F2(int n) {
for(int i = 0;i<n;i++) F1(); };
};
class Child : public Parent
{
public:
void F1() { cout<<”I am Parent<<endl; }
};
int main() {
Child child;
child.F2(3);
return 0;
}
Natija:
I am Child
I am Child
I am Child
Mana   endi   dastur   kutilayotgan   natijani   chiqarib   beradi.   Kompilyator
Child.F2(3)   ifodasini   meros   qilib   olingan   Parent::F2   funksiyasi   murojaatiga
translyasiya   qilib   yuboradi,   bu   funksiya   esa,   o’z   navbatida,   Child::F1   avlodining
qayta aniqlangan virtual funksiyasini chaqirib oladi.
Agar   funksiya   bazaviy   sinfda   virtual   deb   e’lon   qilingan   bo’lsa,   uni   faqat
hosila   sinflarda   qayta   aniqlash   mumkin,   bunda   parametrlar   ro’yxati   avvalgidek
qolishi   zarur.   Agar   hosila   sinfning   virtual   funksiyasi   parametrlar   ro’yxatini
o’zgartirgan   bo’lsa,   bu   holda   uning   bazaviy   sinfdagi   (hamda   uning   barcha
ajdodlaridagi) versiyasi kirib bo’lmas bo’lib qoladi. Boshida bunday vaziyat boshi
berk   ko’chaga   kirib   qolgandek   ko’rinishi   mumkin,   -   amalda   ortiqcha   yuklanish
mexanizmini qo’llab-quvvatlamaydigan OMD tillarida shunday bo’ladi ham. C++
bu   muammoni   virtual   funksiyalardan   emas,   balki   xuddi   shu   nomli,   faqat   boshqa
parametr   ro’yxatiga   ega   bo’lgan   ortiqcha   yuklangan   funksiyalardan   foydalangan
holda xal qiladi.             Foydalanilgan ea dabiyotlar ro’yxati
1. Sh.A.Nazirov, R.V.Qobulov, M.R.Babajanov «C va C++ TILI»
2. Informatika fanidan o’quv qo’llanma //TATU 489 b. Toshkent, 2012.
3. C / C ++.   Программирование   на   языке   высокого   уровня   /   Т.   А.
Павловская. — СПб.:Питер, 2003. —461 : ил.
4. Программирование на языке С++ в среде  Qt   Creator :
5. / Е. Р. Алексеев, Г. Г. Злобин, Д. А. Костюк,О. В. Чеснокова,
6. А. С. Чмыхало — М. :  ALT   Linux , 2015. — 448 с.
7. Жасмин   Бланшет,   Марк   Саммерфилд   Qt   4:Программирование   GUI   на
C ++
8. М.Шлее,  Qt  5.10. Професиональное программирование на С++. - СПб.:
БХВ-Петербург, 2018. - 1072 с.

Mavzu: Sinflar orasida munosabatlar. Reja: 1. Abstrakt sinflar. 2. Inkapsulyasiya, Vorislik , Polimorfizm tushunchalari. 3. Samarali inkapsulyasiyalash. 4. Sodda vorislik. Ko’plikdagi vorislik. Polimorf usullar.

Abstrakt sinf ta’rifi. Hech bo’lmasa bitta sof (bo’sh) virtual funksiyaga ega bo’lgan sinf abstrakt sinf deyiladi. Quyidagi e’longa ega bo’lgan komponentali funksiya sof virtual funksiya deyiladi: virtual <tur> <funksiya_nomi> (<formal_parametrlar_ro’yxati>) = 0; Bu yozuvda « = 0» konstruksiya «sof spesifikator» deyiladi. Sof virtual funksiya ta’rifiga misol: virtual void fpure (void) = 0; Sof virtual funksiya hech narsa qilmaydi va uni chaqirib bo’lmaydi. Uning qo’llanilishi – hosila sinflarda uning o’rnini egallovchi funksiyalar uchun asos bo’lish. Abstrakt sinf esa hosila sinf uchun asosiy (bazaviy) sinf sifatida ishlatilishi mumkin. Agar sof virtual funksiya hosila sinfda to’liq ta’riflanmasa, u hosila sinfda ham sof virtual bo’lib qoladi, natijada hosila sinf ham abstrakt sinf bo’ladi. Abstrakt sinfni faqat boshqa sinf ajdodi sifatida ishlatish mumkin: Ba’zi sinflar abstrakt tushunchalarni ifodalaydi va ular uchun ob’ekt yaratib bo’lmaydi. Bunday sinflar biror hosila sinfda ma’noga ega bo’ladi:masalan, class Abstract { public: virtual void draw() = 0; }; class Derived : public Abstract { public: void draw() { cout « "Salom.";} }; int main( void ) { Derived d;

Abstract a; return 0; } Agar sof virtual funksiya hosila sinfda to’liq ta’riflanmasa, u hosila sinfda ham sof virtual bo’lib qoladi, natijada hosila sinf ham abstrakt sinf bo’ladi. class Abstract { virtual int f() = 0; virtual float g(float) = 0; }; class Derived : class Abstract { int f(); }; int main (void) { Abstract a; //hato Derived d; // hato } Abstrakt sinflar realizasiya detallarini aniqlashtirmasdan faqat interfeysni ko’rsatish uchun ishlatiladi. Masalan, operasion tizimda qurilma drayveri abstract 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.Abstrakt sinf turidagi o’zgaruvchi yaratib bo’lmaydi, lekin abstrakt sinf turidagi ko’rsatkich yaratish mumkin. Bu ko’rsatkichga abstrakt sinf abstract bo’lmagan turli avlodlari adresini qiymat sifatida berib, abstrakt usulga mos turli usullarni chaqirish mumkin. 2. Inkapsulyasiya, Vorislik , Polimorfizm tushunchalari. Inkapsulyasiya Inkapsulatsiyalash, vorislik va polimorfizm obyektga mo'ljallangan dasturlash (OMD) ning uchta bazaviy tushunchasi hisoblanadi. Inkapsulyasiyalash - ma’lumotlarning va shu ma’lumotlar ustida ish olib boradigan kodlarning bitta ob’ektda birlashtirilishi. OMD atamachiligida ma’lumotlar ob’ekt ma’lumotlari a’zolari (data members) deb, kodlar ob’ektli usullar yoki funksiya-a’zolari (methods, member functions) deb ataladi. Inkapsulyasiya yordamida berilganlarni yashirish ta’minlanadi. Bu juda yaxshi xarakteristika bo’lib foydalanuvchi o’zi ishlatayotgan ob’ektning ichki ishlari haqida umuman o’ylamaydi. Haqiqatan ham, xolodilnikni ishlatishda refrijektorni ishlash prinsipini bilish shart emas. Yaxshi ishlab chiqilgan dastur ob’ektini qo’llashda uning ichki o’zgaruvchilarining o’zaro munosabati haqida qayg’urish zarur emas. C++ tilida inkapsulyasiya prinsipi sinf deb ataluvchi nostandart turlarni(foydalanuvchi turlarini) hosil qilish orqali himoya qilinadi. Inkapsulatsiyalash dasturni qandaydir monolit, boiinmas narsa sifatida olib qaramay, ko'plab mustaqil elementlarga bo'lish imkonini beradi. Har bir element o'z funksiyalarini boshqa elementlardan mustaqil ravishda bajara oladigan alohida modul sifatida olib qaraladi. Aynan inkapsulatsiyalash tufayli mustaqillik darajasi ortadi, chunki ichki detallar interfeys ortida yashiringan boiadi. Vorislik

Vorislik mavjud bo'lgan sinfning ta'rifi asosidayoq yangi sinfni yaratish| imkonini beradi. Yangi sinf boshqasi asosida yaratilgach, uning ta'rifi avtomatik tarzda mavjud sinfning barcha xususiyatlari, xulq-atvori va joriy qilinishiga vorislik qiladi. Awal mavjud bo’lgan sinf interfeysining barcha metodlari va xususiyatlari avtomatik tarzda voris interfeysida paydo bo'ladi. Vorislik voris sinfida biror bir jihatdan to'g'ri kelmagan xulq-atvorni awaldan ko'ra bilish imkonini beradi. Bunday foydali xususiyat dasturiy ta'minotni talablarning o'zgarishiga moslashtirish imkonini beradi. Agar o'zgartirishlar kiritishga ehtiyoj tug'ilsa, bu holda eski sinf funksiyalariga vorislik qiluvchi yangi sinf yozib qo'ya qolinadi. Keyin o'zgartirilishi lozim boMgan funksiyalarga qaytadan ta'rif beriladi hamda yangi funksiyalar qo'shiladi. Bunday o'rniga o'rin qo'yishning mazmuni shundan iboratki, u dastlabki sinf ta'rifini o'zgartirmay turib, obyekt ishini o'zgartirish imkonini beradi. Agar siz ko'p martalab qo'Uash yoki boshqa biron maqsadlarga ko'ra vorislikni qo’llashga ahd qilsangiz, awal har gal qarang — merosxo'r—sinf bilan vorislikni berayotgan sinfning turlari o'zaro mos keladimi? Vorislikda turlarning mos kelishi ko'pincha «Is-a» testi deb ataladi. Ikkita sinf bir xil turga ega bo'lgandagina o'zaro «Is-а» munosabatida turibdi deb hisoblanadi. Vorislik — sinflar o'rtasida «Is-а» munosabatlarini o'rnatish imkonini beradigan mexanizm. Merosxo'r sinf o'z ajdodi bo’lgan sinfdan xususiyatlar va xulq-atvorni meros qilib olayotganida, u shuningdek, o'z ajdodi boMgan sinf, ehtimol, boshqa sinflardan meros qilib olgan xususiyatlar va xulq-atvorga ham ega bo’ladi. Vorislik tabaqalanishi qandaydir ma'no kasb etishi uchun ajdodlar ustidan qanday amallar bajarilgan boMsa, avlodlar ustidan ham shunday amallar bajarilish imkoniyati boMishi lozim. Bu «Is-а» testi yordamida tekshiriladi. Merosxo'r sinfga funksiyalarni kengaytirish va yangilarini qo'shish uchun ruxsat beriladi. Ammo unga funksiyalarni chiqarib tashlashga ruxsat yo'q.