Vorislik hususiyatlari
Vorislik -sinflarda ierarxik ko’rinishdagi sinflanishni ta’minlaydi
C++ terminologiyasida:
Asos sinf (ya’ni voris olinadigan sinf ) base class (asos sinf) deb ataladi.
Voris sinf (ya’ni voris olish orqali yaratiladigan yangi sinf) derived class (voris sinf) deb ataladi.
Voris sinf boshqa bironta sinf uchun asos sinf bo’lishi mumkin.
Demak, bu orqali ko’p sathli vorislik (multiple inheritance) vujudga keladi.
Vorislikdan foydalanish
Biron bir sinfdan voris olingandan keyin, ushbu asos sinf a’zolari voris sinfning ham a’zolari bo’lib hisoblanadi.
class voris-sinf-nomi : access asos-sinf-nomi {
// voris sinf tanasi
};
C++ dasturlash tilida voris olish umumiy formasi quyidagicha:
Misol :
class base {
int i, j;
public:
void set(int a, int b) { i=a; j=b; }
void show() { cout << i << " " << j << "\n"; }
};
class derived : public base {
int k;
public:
derived(int x) { k=x; }
void showk() { cout << k << "\n"; }
};
int main()
{
derived ob(3);
ob.set(1, 2); // asos sinf a’zosiga ruxsat ochiq
ob.show(); // asos sinf a’zosiga ruxsat ochiq
ob.showk(); // voris sinf a’zosidan foydalanish
}
Voris olish turlar
Voris sinf quyidagi ko’rinishlarda, ya’ni murojaat turlari bilan farqlangan holda olinishi mumkin. Bular: public, protected va private vorislik ko’rinishlaridir :
// public (umumiy) vorislik
class derived1: public Base{…};
// private (xususiy) vorislik
class derived2: private Base{….};
// protected (himoyalangan) vorislik
class derived3: protected Base{….};
// default (oddiy-xususiy) vorislik
class derived4: Base{….};
Public vorislik:
Bunda asos sinfning public a’zolari voris sinfning ham public a’zolari va asos sinfning protected a’zolari voris sinfning protected a’zolariga aylanadi.
Lekin asos sinfning private a’zolari voris sinf uchun yopiqligicha qoladi.
Protected vorislik:
Bunda asos sinfning public va protected a’zolari voris sinf uchun protected a’zo bo’lib o’tadi.
Private vorislik:
Bunda asos sinfning public va protected a’zolari voris sinfning private a’zosiga ayanadi.
Bir nechta sinflardan voris olish
Bir vaqtning o’zida bir nechta sinfdan voris olish mumkin.
Masalan, voris sinf derived ikkita base1 va base2 lardan voris olyapti.
Quyidagicha formada bir nechta sinfdan voris olish mumkin:
class derived : public base-class1, public base-class2, …
Polimorfizm
Polimorfizm –bu kodning, bajarilish paytidan yuzaga keladigan holatga bog‘liq ravishda o‘zini turlicha amal qilish xususiyatidir. Polimorfizm – bu faqat ob’ektlar xususiyati bo‘lmasdan, balki funksiyalar-a’zolar xususiyatidir va ular xususan, bitta nomdagi funksiya-a’zoni, har xil turdagi argumentlarga ega va bajaradigan amali unga uzatiladigan argumentlar turiga bog‘liq bo‘lgan funksiyalar uchun (o‘rnida) foydalanish imkoniyatida namoyon bo‘ladi.
Bu holatga funksiyalarni qayta yuklash deyiladi. Polimorfizm amallarga ham qo‘llanishi mumkin, ya’ni amal mazmuni (natijasi) operand (berilgan) turiga bog‘liq bo‘ladi. Polimorfizmning bunday turiga amallarni qayta yuklash deyiladi.
Polimorfizm yana bir ta’rifi quyidagicha: polimorfizm – bu tayanch sinfga ko‘rsatkichlarning (murojaatlarning) virtual funksiyalarni chaqirishdagi turli shakl (qiymatlarni) qabul qilish imkoniyatidir.
C++ tilining bunday imkoniyati kechiktirilgan bog‘lanish natijasidir. Kechiktirilgan bog‘lanishda chaqiriladigan funksiya-a’zolar adreslari programma bajarilishi jarayonida dinamik ravishda aniqlanadi.
An’anaviy programmalash tillarida esa bu adreslar statik bo‘lib, ular kompilyasiya paytida aniqlanadi (oldindan bog‘lanish).
Polimorfizm – bu bitta interfeys, bir nechta metod. Ya’ni metodlarni overload yoki override ko’rinishidir. Polimorfizm ikki xil ko’rinishda namoyon bo’ladi
compile time;
run time;
Compile time polimorfizm bu funksiyalar va operatorlar overloadi, ya’ni funksiyalar va operatorlarning qo’shimcha yuklanishidir (function overloading or operator overloading).
Runtime polimorfizm bu – vorislik va virtual funksiyalardan foydalanishda vujudga keladi (Function overriding).
Virtual funksiya
Virtual funksiya asos sinf a’zosi hisoblanadi va voris sinfda qayta bir xil parametr asosida e’lon qilinadi.
Virtual funksiya yaratish uchun, asos sinf ichida funksiya yaratilishi jarayonida virtual kalit so’zidan foydalaniladi.
Asos sinfda virtual funksiya e’lon qilingan bo’lsa, voris sinfda ushbu funksiya qayta e’lon qilinishi mumkin va o’z xususiyatlaridan kelib chiqqan holda funksiya tanasi boshqacha yozilishi mumkin.
Ushbu qayta e’lon qilingan funksiyaning barcha parametrlari asos sinfdagi funksiya parametrlari bilan bir xil bo’lishi lozim, misol uchun: funksiya qaytarish tipi, argumentlar soni va tipi.
Virtual funksiyaning ierarxik xususiyati
Asos sinfda virtual funksiya yaratilgan va bu voris sinf uchun override qilinishi mumkin.
Agar voris sinfda mazkur virtual funksiya override qilinmagan bo’lsa nima bo’ladi?
Bunda voris sinf obyekti virtual funksiyaga murojaat qiladi, ya’ni asos sinf virtual funksiyasiga.
Quyida misol keltirilgan:
Misol
class base {
public:
virtual void vfunc() {
cout << "This is base's vfunc().\n";
} };
class derived1 : public base {
public:
void vfunc() {
cout << "This is derived1's vfunc().\n";
}
};
class derived2 : public base {
public:
// vfunc() override qilinmagan
};
int main()
{
base *p, b;
derived1 d1;
derived2 d2;
// base sinfga ko’rsatkich
p = &b;
p->vfunc(); // base sinf vfunc() virtual funksiyasi
// derived1 sinfga ko’rsatkich
p = &d1;
p->vfunc(); // derived1 sinf vfunc() virtual funksiyasi
// derived2 sinfga ko’rsatkich
p = &d2;
p->vfunc(); // derived2 sinf vfunc() virtual funksiyasi
return 0;
}
Do'stlaringiz bilan baham: |