C++ da Polymorphism
Polymorphism ob'ektga yo'naltirilgan dasturlashning (OOP) asosiy tushunchalaridan biri bo'lib, C++ tilida bir xil interfeys orqali har xil turdagi ob'ektlarga kirish imkonini beradi. Polimorfizm ikki yunoncha so'zdan olingan: poli (ko'p) va morfos (shakllar), bu funksiya yoki obyektning ko'p shakllarga ega bo'lishiga imkon beradi.
C++ tilida polimorfizm asosan ikki turga bo'linadi:
- Compile-time (or static) polymorphism
- Run-time (or dynamic) polymorphism
Compile-time (or static) polymorphism
Kompilyatsiya vaqtidagi polimorfizm kompilyatsiya bosqichida hal qilinadi. U C++ da ikki xil usulda amalga oshiriladi:
- Function overloading (Funksiyalarni haddan tashqari yuklash )
- Operator overloading (Operator modifikatsiyasi)
Function overloading
Funktsiyani haddan tashqari yuklash bir nechta funktsiyalarga bir xil nomga ega bo'lishiga imkon beradi, lekin turli xil parametr turlari yoki qiymatlar. Tegishli funksiya kompilyator tomonidan funksiya chaqiruvi vaqtida uzatilgan argumentlar asosida tanlanadi.
Ko’rib turganingizdek funksiyalar nomi bir hil ammo dastur kompilyatsiya jarayonida qiymatga qarab kerakli funksiyani olib keladi.
Operator overloading
Ushbu usulda biz biror operatorni boshqacharoq shaklda foydalanishimiz mumkin. Misol uchun “<<
” operatori odatda biz ushbu operatoni cout funksiyasi bilan birga foydalanar edik. Ushbu operator asosiy vazifasi qiymatlarni ekranga chop qilish.
Yuqorida oddiygina cout funksiyasidan foydalandik lekin natija quidagicha formatda ekranga chop qilindi “Ism: John, Yosh: 30”. Yuqoridagi kodimizni tahlil qiladigan bo’sak class kalit sozi yordamida Person obyektini hosil qilib oldik. Ma’lumotlar uchun konstruktor funksiyamizni ham.
friend - Bu kalit so’z operator<<
funksiyasi Person obyektining do'sti ekanligini bildiradi. Do’st funksiyalar obyektning a’zosi (member) bo’lmasa ham obyektning shaxsiy a’zolariga (bu yerda ism va yosh o’zgaruvchilari) kira oladi.
ostream& - bu ostream nomli cout, cerr kabi chiqish oqimlari uchun ishlatiladigan C++ ning standart kutubxonasi hisoblanadi. ampersand (&
) belgisi esa ostream kutubxonasiga havola ma’nosini anglatadi.
operator<<
- “<<
” operatori uchun qo’shimcha vazifa yuklovchi sintaksis. Ushbu holatda operatorimiz Person obyekti bilan qanday ishlashini belgilashimiz mumkin.
ostream& operator<<
(ostream& os, Person p) - Bu to’liq funksiyamizni ko’rinishi bo’lib o’z ichiga ikkita parameter qabul qiladi:
- ostream& os: chiqish oqimi obyektiga havola, masalan, cout yoki offstream.
- Person p: Biz chiqarmoqchi bo'lgan shaxs ob'ekti.
Ko’rib turganingizdek ushbu usul orqali operatorlardan boshqacharoq shakllarda ham foydalanishingiz mumkin.
Run-Time Polymorphism
Run-time polimorfizmiga inheritance va virtual funktsiyalar orqali erishiladi.
Virtual funksiya - bu meros obyektlar tomonidan meros qilib olingan asosiy obyekt funksiyasi hisoblanadi.
Yuqorida ko’rib turganingizdek Animal obyektimizdagi sound() funksiyamizni keyingi ikki meros obyektlarimizda turli shaklda ishlatdik.