public
protected
private
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
}
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
}
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
}
Ushbu misol tahlili quyidagicha:
Ushbu misolda asos sinfdan public murojaat turi orqali voris olindi
class derived : public base {….}
Bunda asos sinfning barcha public a’zolari voris sinfning ham public a’zolari bo’ladi.
Asos sinfning barcha himoyalangan (protected) a’zolari voris sinfning protected a’zolari bo’ladi.
Lekin, asos sinfning private a’zolari voris sinf uchun ham, boshqa sinflar uchun ham not accessible bo’ladi ,ya’ni asos sinfning private a’zolariga to’g’ridan to’g’ri murojaat yo’q.
Agar voris sinf private xususiyati orqali yaratilsa, bunda asos sinfning barcha public va protected a’zolari voris sinfning private a’zolari qatoriga o’tadi.
Ma’lumotlarga murojaat turlari va vorislik:
Murojaat turlari
|
public
|
protected
|
private
|
Asos sinf
|
yes
|
yes
|
yes
|
Voris sinf
|
yes
|
yes
|
no
|
Boshqa sinf (yoki main funksiya)
|
yes
|
no
|
no
|
Voris olish turlari :
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 –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).
Kechiktirilgan bog‘lanish faqat virtual funksiyalar uchun o‘rinli.
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 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 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:
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;
}
Sinfning virtual atributlari vorisga o’tishi :
Asos sinfdan voris olinganda ushbu sinfdagi virtual funksiya ham vorislik xususiyatiga ega bo’ladi.
Bu shuni bildiradiki, asos sinf virtual funksiyasi voris sinf uchun mavjud bo’lgani bilan birga, ushbu voris sinfdan yana voris olingan holda ham ushbu virtuallik xususiyati saqlanib qoladi. Ya’ni ushbu funksiya ikkinchi voris sinf uchun ham override qilinadi.
Bu xususiyat bir nechta vorislikda ham saqlanib qoladi.
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 , voris sinf obyekti virtual funksiyaga murojaat qiladi, ya’ni asos sinf virtual funksiyasiga.
Abstrakt sinf tushunchasi :
C++ tilida kamida bitta virtual funksiyaga ega bo’lgan sinf abstrakt sinf deyiladi.
Abstrakt sinfning asosiy xususiyatidan biri shuki, ushbu turdagi sinfdan obyekt olib bo’lmaydi.
Demak sinfni to’la abstractligini ta’minlash uchun quyidagi qonuniyatdan foydalanamiz:
class base{
public:
virtual vfunc(args....) = 0;
..... }
Xulosa qilib aytish mumkinki , demak sinf – bu dasturchi tomonidan yaratilgan sun’iy tur hisoblanadi.
Sinf orqali ob’yektlar hosil qilinadi. Ob’yektlar orqali esa sinf maydonlariga murojaat qilinadi.
Назорат саволлари :
Маълумотларни абстрактцияси деганда нима тушунилади?
Класс нима ?
Конструктор қандай ишни бажаради?
Деконструктор вазифаси нима ?
Sinf ichki berilganlariga murojaatni qanday cheklab qo‘yishi mumkin?
friend funksiya ga ta’rif bering
Inkapsulatsiya tushunchasini yoriting
Merosho’rlik tushunchasiga ta’rif bering
Polimorfizm tushunchasi nimani anglatadi
Virtual funksiya ga ta’rif bering
Foydalanilgan adabiyotlar :
Herbert Shield “C++ The complete references – fourth edition” 2003. Part -2, Chapter – 17.
TutorialsPoint – simply easy learning programming: http://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm
http://www.questionscompiled.com/answer/cpp/148/compile-time-polymorphism-and-run-time-polymorphism
Dostları ilə paylaş: |