Virtual funksiyalar


ULASHISH

C++ virtual funksiyalar

Virtual funksiya — asosiy sinfdagi a’zo funksiya bo‘lib, uni hosila sinflarda qayta aniqlash (override) mumkin.

Virtual funksiyalar C++ tilidagi polimorfizmning asosiy qismidir. Ular turli obyektlarga bitta funksiya chaqiruviga turlicha javob berish imkonini beradi.


Nima uchun virtual funksiyalardan foydalaniladi?

virtual bo‘lmasa, C++ qaysi funksiyani chaqirishni obyektning haqiqiy tipiga qarab emas, balki ko‘rsatkich tipiga qarab hal qiladi.

virtual bilan esa u ko‘rsatkich ko‘rsatayotgan haqiqiy obyektni tekshiradi.

Yoki yanada soddaroq qilib aytganda:

  • virtual bo‘lmasa: obyekt farzand sinfga tegishli bo‘lsa ham, asosiy sinf funksiyasi ishlaydi.
  • virtual bilan: siz kutganingizdek farzand sinfdagi variant ishlaydi.

Virtual funksiyasiz

Misol (virtual kalit so‘zisiz)

class Animal {   public:     void sound() {       cout << "Animal sound\n";     } }; class Dog : public Animal {   public:     void sound() {       cout << "Dog barks\n";     } }; int main() {   Animal* a;  // Declare a pointer to the base class (Animal)   Dog d;  // Create an object of the derived class (Dog)   a = &d;  // Point the base class pointer to the Dog object   a->sound(); // Call the sound() function using the pointer. Since sound() is not virtual, this calls Animal's version   return 0; }
O‘zingiz sinab ko‘ring »

a ko‘rsatkichi Dog obyektini ko‘rsatib tursa-da, funksiya virtual bo‘lmagani uchun baribir Animal::sound() chaqiriladi.



Virtual funksiya bilan

Misol (virtual kalit so‘zi bilan)

class Animal {   public:     virtual void sound() {       cout << "Animal sound\n";     } }; class Dog : public Animal {   public:     void sound() override {       cout << "Dog barks\n";     } }; int main() {   Animal* a;   Dog d;   a = &d;   a->sound(); // Outputs: Dog barks   return 0; }
O‘zingiz sinab ko‘ring »

Endi ishlaydi! sound() funksiyasi virtual bo‘lgani uchun chaqiruv shunchaki ko‘rsatkich tipidagi emas, balki haqiqiy obyektdagi funksiyadan foydalanadi.

  • virtual kalit so‘zini faqat asosiy sinfda ishlating
  • Aniqlik uchun hosila sinfda override kalit so‘zini ishlating (ixtiyoriy, lekin tavsiya etiladi)

C++ tilidagi -> operatori

Yuqoridagi misollarda nega -> ishlatganimiz sizni qiziqtirayotgan bo‘lishi mumkin.

-> operatori a’zolarga (funksiyalar yoki o‘zgaruvchilar kabi) ko‘rsatkich orqali murojaat qilish uchun ishlatiladi.

Bu (*pointer).member yozuvining qisqa shakli:

Animal* a = new Animal(); a->sound(); // Same as (*a).sound();

Maslahat: Agar obyektga ko‘rsatkichdan foydalanayotgan bo‘lsangiz, uning a’zolariga murojaat qilish uchun -> operatorini ishlating.



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!