Polimorfizm — OOP ning uchinchi ustuni. So’zning ma’nosi “ko’p shakllilik”: bitta nom yoki interfeys turli obyektlarda turlicha xatti-harakat qiladi. Bu OOP ning eng nafis va kuchli imkoniyati — u sizga bir xil kod bilan turli obyektlarni boshqarish imkonini beradi.
Polimorfizm — bir interfeys (metod nomi) orqali turli sinf obyektlarining o’ziga xos xatti-harakatini chaqirish qobiliyati. C++’da u asosan
virtualmetodlar orqali amalga oshiriladi.
Muammo: oddiy meros yetarli emas
Avval oddiy override ning cheklovini ko’ramiz. Ota sinf ko’rsatkichi orqali bola metodini chaqirsak, virtualsiz doim ota versiyasi ishlaydi:
#include <iostream>
using namespace std;
class Hayvon {
public:
void ovoz() {
cout << "Noma'lum ovoz" << endl;
}
};
class Mushuk : public Hayvon {
public:
void ovoz() {
cout << "Miyov" << endl;
}
};
int main() {
Hayvon* h = new Mushuk();
h->ovoz(); // virtualsiz: ota versiyasi ishlaydi
delete h;
return 0;
}
Noma'lum ovoz
h aslida Mushuk ga ishora qilsa-da, Hayvon versiyasi ishladi. Bu ko’pincha biz istagan natija emas.
Yechim: virtual metodlar
Ota sinf metodini virtual deb belgilasak, C++ obyektning haqiqiy turiga qarab to’g’ri metodni tanlaydi:
#include <iostream>
using namespace std;
class Hayvon {
public:
virtual void ovoz() {
cout << "Noma'lum ovoz" << endl;
}
};
class Mushuk : public Hayvon {
public:
void ovoz() override {
cout << "Miyov" << endl;
}
};
class It : public Hayvon {
public:
void ovoz() override {
cout << "Vov" << endl;
}
};
int main() {
Hayvon* hayvonlar[2] = { new Mushuk(), new It() };
for (int i = 0; i < 2; i++) {
hayvonlar[i]->ovoz(); // har biri o'z ovozini chiqaradi
}
return 0;
}
Miyov
Vov
Mana polimorfizmning butun kuchi: bir xil ovoz() chaqiruvi har bir obyektda uning haqiqiy turiga mos ishladi. virtual va override kalit so’zlari buni ta’minladi.
virtual va oddiy metod farqi
Ikkovining farqini jadvalda ko’ramiz:
| Xususiyat | Oddiy metod | virtual metod |
|---|---|---|
| Qaysi versiya ishlaydi | ko’rsatkich turiga qarab | obyekt turiga qarab |
| Polimorfizm | ishlamaydi | ishlaydi |
| Ishlatilishi | oddiy meros | ko’p shakllilik |
Nega polimorfizm kuchli?
Polimorfizm tufayli siz bir umumiy interfeys (masalan, Hayvon) bilan ishlaysiz, aniq turlar (Mushuk, It) esa har biri o’zicha javob beradi. Yangi tur qo’shsangiz — masalan, Ot — mavjud kodni umuman o’zgartirmaysiz. Bu kengaytiriladigan, moslashuvchan tizimlar qurishning kalitidir.
Xulosa
Bu bo’limda polimorfizmni, virtual va override bilan obyekt turiga qarab to’g’ri metodni chaqirishni, uning oddiy metoddan farqini va amaliy foydasini ko’rib chiqdik. Enkapsulatsiya, meros va polimorfizm bilan OOP ning uch asosiy ustunini o’zlashtirdik. Keyingi darsda fayllar bilan ishlashga o’tamiz.