Polymorphism

C++ da polymorphism haqida

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.

#include <iostream>
using namespace std;
 
class Print {
public:
    void show(int i) {
        cout << "Integer raqamlar: " << i << endl;
    }
 
    void show(double f) {
        cout << "Double raqamlar: " << f << endl;
    }
 
    void show(string s) {
        cout << "Matn turi: " << s << endl;
    }
};
 
int main() {
    Print obj;
    obj.show(5);       // int parameterlik funksiyani chaqiradi
    obj.show(5.5);     // double parameterlik funksiyani chaqiradi
    obj.show("Hello"); // string parameterlik funksiyani chaqirdi
    return 0;
}

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.

#include <iostream>
using namespace std;
 
class Person {
private:
    string ism;
    int yosh;
 
public:
    // Konstruktor funksiya
    Person(string i, int y) : ism(i), yosh(y) {}
 
    //  "<<" operatori uchun overload funksiyasi
    friend ostream& operator<<(ostream& os, Person p) {
        os << "Ism: " << p.ism << ", Yosh: " << p.yosh;
        return os;
    }
};
 
int main() {
    Person p("John", 30);
    cout << p << endl;  // Natija: Ism: John, Yosh: 30
    return 0;
}

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 ostream& operator<<(ostream& os, Person p) {
        os << "Ism: " << p.ism << ", Yosh: " << p.yosh;
        return os;
    }

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.

#include <iostream>
using namespace std;
 
class Animal {
public:
    virtual void sound() {
        cout << "Animal makes a sound." << endl;
    }
};
 
class Dog : public Animal {
public:
    void sound() override {
        cout << "Dog barks." << endl;
    }
};
 
class Cat : public Animal {
public:
    void sound() override {
        cout << "Cat meows." << endl;
    }
};
 
int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();
 
    animal1->sound();  // Dog obyekti funksiyasini chaqiradi
    animal2->sound();  // Cat obyekti funksiyasini chaqiradi
    delete animal1;
    delete animal2;
 
    return 0;
}

Yuqorida ko’rib turganingizdek Animal obyektimizdagi sound() funksiyamizni keyingi ikki meros obyektlarimizda turli shaklda ishlatdik.

Ushbu sahifada

Xato haqida xabar berish