Sobes.tech
Junior

C++ da virtual so'zining kalit so'zi haqida nima bilasiz?

sobes.tech AI

AIdan javob

virtual C++ da'vo ishlatiladi asosiy sinfda virtual funktsiyalarni e'lon qilish uchun. Bu vaqt o'tkazish (runtime polymorphism)ni amalga oshirish imkonini beradi.

Qo'llanilishi:

  • Asosiy sinfda funksiyani belgilaydi, uni meros olgan sinflarda (override) qayta yozish mumkin.
  • Virtual funktsiya orqali chaqirilganda, aslida meros olgan sinf ob'ektidagi funksiya amalga oshiriladi (agar qayta yozilgan bo'lsa). Bu vaqt o'tkazish orqali virtual funktsiyalar jadvali (vtable) yordamida amalga oshiriladi.

Asosiy nuqtalar:

  • Faqat sinf a'zolari funksiyalar virtual bo'lishi mumkin. Global funksiyalar, statik funksiyalar va konstruktorlar virtual bo'lishi mumkin emas.
  • Destruktorlar vaqti-vaqti bilan virtual bo'lishi kerak, chunki asosiy sinfga ishora qiluvchi ko'rsatkich orqali meros olgan sinf ob'ektlarini o'chirishda xotira oqib ketishining oldini oladi.
  • Agar funksiya asosiy sinfda virtual deb e'lon qilingan bo'lsa, u avtomatik ravishda barcha meros olgan sinflarda virtual qoladi, hatto virtual so'zi ishlatilmasa ham (garchi virtual va override ishlatish tavsiya etiladi).
  • Toza virtual funksiyalar = 0 bilan e'lon qilinadi va sinfni abstrakt qiladi. Bunday sinfni to'g'ridan-to'g'ri instansiya qilish mumkin emas.

Misol:

#include <iostream>

class Base {
public:
    virtual void print() {
        std::cout << "Base'dan" << std::endl;
    }

    virtual ~Base() {
        std::cout << "Base destruktor" << std::endl;
    }
};

class Derived : public Base {
public:
    void print() override { // override bilan aniq qayta yozish
        std::cout << "Derived'dan" << std::endl;
    }

    ~Derived() override { // override bilan
        std::cout << "Derived destruktor" << std::endl;
    }
};

int main() {
    Base* ptr = new Derived(); // asosiy sinf ko'rsatkichi meros olgan ob'ektga ishora qilmoqda

    ptr->print(); // virtual funktsiya tufayli Derived::print() chaqiriladi
    delete ptr;   // Derived va Base destruktorlari chaqiriladi, virtual destruktor tufayli

    return 0;
}

Bog'liq tushunchalar:

  • vtable (virtual funktsiyalar jadvali): Sinfning virtual funktsiyalariga ko'rsatkichlar jadvali. Har bir virtual funktsiyalar bilan ob'ekt o'z vptr ko'rsatkichini o'z ichiga oladi, u vtable'ga ishora qiladi.
  • vptr (vtable ko'rsatkichi): Ishga tushirish vaqtida chaqiriladigan funktsiyani aniqlash uchun zarur.
  • = 0 (toza virtual funktsiya): Bu funktsiya bu sinfda amalga oshirilmaganligini bildiradi, sinfni abstrakt qiladi.
  • override (qayta yozish uchun belgilovchi): Bu, meros olgan sinfda virtual funktsiyani aniq qayta yozishni bildiradi. Xatolarni aniqlashga yordam beradi.
  • final (belgilovchi): Virtual funktsiyaning keyingi qayta yozilishini yoki sinfning meros olinishini taqiqlaydi.

Xulosa qilib aytganda, virtual C++da meros olinish va dinamik bog'lanish orqali polimorfizmni amalga oshirish uchun asosiy mexanizmdir.