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
virtualdeb e'lon qilingan bo'lsa, u avtomatik ravishda barcha meros olgan sinflarda virtual qoladi, hattovirtualso'zi ishlatilmasa ham (garchivirtualvaoverrideishlatish tavsiya etiladi). - Toza virtual funksiyalar
= 0bilan 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.