Skip to content

Virtual funksiyalar (Virtual Functions)

C++ Virtual funksiyalari

Virtual funksiya — asosiy sinfda hosila sinflarda qayta aniqlash mumkin bo'lgan a'zo funksiya.

Virtual funksiyalar C++ da polimorfizmning asosiy qismidir. Ular turli obyektlarga bitta funksiya chaqiruviga turlicha javob berishga imkon beradi.


Nima uchun virtual funksiyalar ishlatiladi?

virtual siz C++ ko'rsatkich turiga qarab qaysi funksiyani chaqirishni hal qiladi, haqiqiy obyekt turiga emas.

virtual bilan esa ko'rsatkich ko'rsatayotgan haqiqiy obyektni tekshiradi.

Oddiyroq qilib aytganda:

  • virtual siz: bola sinf obyekti bo'lsa ham, asosiy funksiya ishlaydi
  • virtual bilan: kutganingizdek bolaning versiyasi ishlaydi

Virtual funksiyasiz

MISOL (virtual kalit so'zsiz)

cpp
class Animal {
  public:
    void sound() {
      cout << "Hayvon ovozi\n";
    }
};

class Dog : public Animal {
  public:
    void sound() {
      cout << "It huradi\n";
    }
};

int main() {
  Animal* a;   // Asosiy sinfga ko'rsatkich e'lon qilish
  Dog d;       // Hosila sinf obyektini yaratish
  a = &d;      // Asosiy sinf ko'rsatkichini Dog obyektiga yo'naltirish
  a->sound();  // sound() virtual emas, shuning uchun Animal versiyasi chaqiriladi
  return 0;
}

a Dog ga ko'rsatsa ham, funksiya virtual emas bo'lgani uchun Animal::sound() chaqiriladi.


Virtual funksiya bilan

MISOL (virtual kalit so'z bilan)

cpp
class Animal {
  public:
    virtual void sound() {
      cout << "Hayvon ovozi\n";
    }
};

class Dog : public Animal {
  public:
    void sound() override {
      cout << "It huradi\n";
    }
};

int main() {
  Animal* a;
  Dog d;
  a = &d;
  a->sound();  // Natija: It huradi
  return 0;
}

Endi ishlaydi! sound() virtual bo'lgani uchun chaqiruv faqat ko'rsatkich turiga emas, haqiqiy obyektning funksiyasiga yo'naladi.

ESLATMA

  • virtual faqat asosiy sinfda ishlatiladi
  • override (ixtiyoriy, lekin tavsiya etiladi) hosila sinfda aniqlik uchun ishlatiladi

C++ da -> operatori

-> operatori ko'rsatkich orqali a'zolarga (funksiya yoki o'zgaruvchilar) kirish uchun ishlatiladi.

Bu (*pointer).member yozishning qisqa shaklidir:

MISOL

cpp
Animal* a = new Animal();
a->sound();  // (*a).sound() bilan bir xil

MASLAHAT

Agar obyektga ko'rsatkich ishlatayotgan bo'lsangiz, uning a'zolariga kirish uchun -> dan foydalaning.