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:
virtualsiz: bola sinf obyekti bo'lsa ham, asosiy funksiya ishlaydivirtualbilan: kutganingizdek bolaning versiyasi ishlaydi
Virtual funksiyasiz
MISOL (virtual kalit so'zsiz)
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)
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
virtualfaqat asosiy sinfda ishlatiladioverride(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
Animal* a = new Animal();
a->sound(); // (*a).sound() bilan bir xilMASLAHAT
Agar obyektga ko'rsatkich ishlatayotgan bo'lsangiz, uning a'zolariga kirish uchun -> dan foydalaning.
