942 – 19 guruhi talabasi Zaripboyev Anvar 12 – tajriba ishi (mta)
Download 53.91 Kb.
|
12 - tajriba ishi
Virtual funksiyalar. OMD da polimorfizmga faqat yuqorida tavsifi berilgan vorislik va ajdod usulini qo‘shimcha yuklatish mexanizmi vositasida emas, balki virtuallash vositasida ham erishiladiki, u ajdod funksiyalarga o‘z avlodlari funksiyalariga murojaat qilish imkonini beradi. Polimorfizm sinf arxitekturasi orqali ishga tushirilac[i. biroq faqat a’zo-funksiyalar polimorf bo‘lishlari mumkin.
C ++ da polimorf funksiya bitta nomdagi ehtimoliy funksiyalardan biriga faqat bajarilish paytida, ya’ni unga sinfning konkret obyekti uzatilayotgan paytda bog‘lab qo‘yiladi. Boshqacha qilib aytganda, dastlabki dastur matnida funksiyaning chaqirilishi faqat taxminan belgilanadi, aynan qanday funksiya chaqirilayotgani aniq ko‘rsatil-maydi. Bu jarayon kechikkan bog‘lanish deb nom olgan. Navbatdagi misol oddiy a’zo- funksiyalarning polimorf bo‘lmaganligi nimaga olib kelishi mumkinligini ko‘rsatadi. #include #include using namespace std; class Parent { public:
void F1() { cout <<"I am Parent" << endl; }; void F2(int n) { for(int i=0; i }; }; class Child: public Parent { public: void F1() { cout << "I am Parent" << endl; }; }; int main() { Child child; child.F2(3);
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 Fl chaqiradi. Parent sinfining hosilasi bo‘lgan Child sinfiga F2 funksiyasi vorislikka o‘tadi, biroq F1 funksiyasi qayta ta’riflanadi. Kompilator vorislikka o‘tgan F2 funksiyani Parent:: F1 funksiyasi bilan bog‘lab. translatsiya qilib yuboradi. C++ kechikkan bog‘lanishni funksiya bajarllish paytida aniqlaydi hamda funksiyalarni virttiallash vositasida ularda pollmorflikni ta’minlaydi. Ajdod va avlod sinflar da virtual funksiyalarni e’lon qilish sintaksisini umum- lashtiradigan inisolni ko‘rib chiqamiz: class classlNamel { //Boshqa a’zo-funksiyalar virtual return Type functionName(< parametrlar ro‘yxati >); class classy ame2: public classNamel { //Boshqa a’zo-funksiyalar virtual return Type functionName(< >); Parent va Child sinflari obyektlarida F1 funksiyasi polimorfligini ta’minlash uchun. uni virtual deb e’1on qilish zarur. Quyida dasturning modifikatsiyalangan matni keltiriladi: #include class Parent { public:
virtual void F1() { cout<<"I am Parent"< void F2(int n) { for(int i=0; i }; }; class Child: public Parent public: void F1() { cout <<"I am Parent" << endl; }; int main() { Chlld child; child.F2(3); return 0; } Mana endi dastur kutilayotgan natijani chiqarib beradi. Kompilator Child.F2(3) ifodasini meros qilib olingan Parent::F2 funksiyasi murojaatlga translatsiya qilib yuboradi, bu funksiya esa. o‘z navbatida, Child::F1 avlodining qayta aniqlangan virtual funksiyasini chaqirib oladi. Agar funksiya bazaviy sinfda v'irtual 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 ajdodlarldag i) versiyasi kirib bo‘lmas bo‘1ib qoladi. Boshida bunday vaziyat boshi berk ko‘chaga kirib qolgandek ko‘rinishi mumkin. A marta 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 fojdalangan holda hal qiladi. Virtual deb e’lon qilingan funksiya, hosila sinflarda virtual kalit so‘z bilan e’lon qilingani yoki qilinmaganidan qat’iy nazar, barcha hosila sinflarda virtual hisoblanadi. Virtual funksiyalardan berilgan sinf obyektiarining o‘ziga xos xulqatvorini ishga solish uchun foydalaning. Barcha usullaringizni virtual deb e’lon qilmang, bu ularni chaqirishda qo‘shimcha hisoblash sarflariga olib keladi. Hamma vaqt, destruktorlarni virtual deb e’lon qiling. Bu sinflar tabaqalanishida obyektlarni yo‘q qilishda polimorf xulq-atvorni ta’minlaydi. Download 53.91 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling