VIRTUAL METODLAR VA POLIFORMIZM. SOF VIRTUAL METODLAR VA ABSTAKSIYA
MAVZU: VIRTUAL METODLAR VA POLIFORMIZM. SOF VIRTUAL METODLAR VA ABSTAKSIYA REJA: a)Kirish. b)Nazariy qism. 1. Virtual metodlar haqida tushuncha. 2. Poliformizm haqida tushuncha. 3. Sof virtual metodlar va abstraksiya. c)Xulosa
KIRISH Virtual funktsiya (shuningdek, virtual usullar sifatida ham tanilgan) asosiy sinf ichida e'lon qilingan va olingan sinf tomonidan qayta belgilangan (bekor qilingan) a'zo funksiyadir. Ko'rsatgich yoki asosiy sinfga havola yordamida olingan sinf ob'ektiga murojaat qilganingizda, ushbu ob'ekt uchun virtual funktsiyani chaqirishingiz va olingan sinfning usul versiyasini bajarishingiz mumkin. Virtual funksiyalar funksiya chaqiruvi uchun foydalaniladigan havola (yoki ko‘rsatkich) turidan qat’i nazar, ob’ekt uchun to‘g‘ri funksiya chaqirilishini ta’minlaydi. Ular asosan runtime poliformizmga erishish uchun ishlatiladi . Funktsiyalar asosiy sinfda virtual kalit so'z bilan e'lon qilinadi . Funktsiya chaqiruvini hal qilish ish vaqtida amalga oshiriladi. Virtual metodlar - bu avlod sinflarda qayta belgilanishi kutilayotgan a'zo funksiya. Ko'rsatkich yoki asosiy sinfga havola yordamida olingan sinf ob'ektiga murojaat qilganingizda, ushbu ob'ekt uchun virtual funktsiyani chaqirishingiz va olingan sinfning funksiya versiyasini bajarishingiz mumkin. Virtual metodlar metodni chaqirishda foydalanilgan ifodadan qat'iy nazar, ob'ekt uchun to'g'ri metod chaqirilishini ta'minlaydi. Virtual funksiyalar uchun qoidalar C++ da virtual funksiyalar uchun qoidalar quyidagicha: 1. Virtual funktsiyalar statik bo'lishi mumkin emas. 2. Virtual funktsiya boshqa sinfning do'st funktsiyasi bo'lishi mumkin. 3. Virtual funktsiyalarga ish vaqti polimorfizmiga erishish uchun ko'rsatgich yoki asosiy sinf turiga mos yozuvlar yordamida kirish kerak. 4. Virtual funktsiyalarning prototipi asosda ham, olingan sinfda ham bir xil bo'lishi kerak.
5. Ular har doim asosiy sinfda aniqlanadi va olingan sinfda bekor qilinadi. Olingan sinfni bekor qilish (yoki virtual funktsiyani qayta belgilash) majburiy emas, bu holda funktsiyaning asosiy sinf versiyasidan foydalaniladi. 6. Sinfda virtual destructor bo'lishi mumkin , lekin unda virtual konstruktor bo'lishi mumkin emas. Virtual funksiyalarning cheklovlari Sekinroq: Funktsiya chaqiruvi virtual mexanizm tufayli biroz ko'proq vaqt oladi va kompilyatorni optimallashtirishni qiyinlashtiradi, chunki kompilyatsiya vaqtida qaysi funktsiya chaqirilishini aniq bilmaydi. Nosozliklarni tuzatish qiyin: murakkab tizimda virtual funksiyalar funksiya qayerdan chaqirilayotganini aniqlashni biroz qiyinlashtirishi mumkin. Hech qachon CONSTRUCTOR yoki DESTRUCTORdan virtual funktsiyani chaqirmang NAZARIY QISM B ir misolni ko rib chiqaylikʻ . Aslida child obyekti Parent sinfiga havola bo lsa ham, rParent Parent sinfiga ʻ havola bo lgani uchun Parent::getName() chaqiriladi. ʻ Quyida virtual metodlardan foydalangan holda ushbu muammoni qanday hal qilishni ko rib chiqamiz. C++ tilidagi virtual metod funksiyaning maxsus turi ʻ bo lib, chaqirilganda ajdod va avlod sinflari o rtasida mavjud bo lgan “eng katta” ʻ ʻ ʻ avlod metodi bajariladi. Bu xususiyat polimorfizm deb ham ataladi. Funksiya imzosi (nom, parametr turlari va metod) va avlod metodining qaytish turi ajdod- sinfning metodining imzosi va qaytish turiga mos kelganda, avlod metodi
chaqiriladi. Bu metodlarni qayta aniqlash deyiladi. Funksiyani virtual qilish uchun funksiya e’lonidan oldin virtual kalit so zini ko rsatish kifoya.ʻ ʻ - Birinchidan, C sinfining c obyekti yaratiladi; - rParent A sinfining havolasi bo lib, biz uni c obyektning A qismiga murojaat ʻ qilish uchun belgilaymiz; - Keyin Parent.getName() metodi chaqiriladi. Parent.getName() metodiga murojaat qilish A::getName() metodiga murojaat qilishga olib keladi. Biroq, A::getName() virtual funksiya bo lganligi sababli, ʻ kompilyator A va C o rtasida "eng katta" avlodning metodini qidiradi. Bu holda, ʻ “eng katta” metod C::getName() hisoblanadi. E'tibor bering, kompilyator D::getName() metodiga murojaat qilmaydi, chunki bizning asl obyektimiz D sinfi emas, C sinfi edi, shuning uchun faqat A va C sinflari orasidagi metodlar hisobga olinadi. Dasturni bajarish natijasi: rParent: C Yanada murakkabroq misolni ko rib chiqamiz. Animal sinfini ko rib ʻ ʻ chiqamiz.
Xuddi shu sinfni speak() metodini virtual qilish orqali ko rib chiqaylikʻ