Junior
C++-də virtual açar söz haqqında nə bilirsiniz?
sobes.tech Süni İntellekt
AI-dan cavab
C++-də virtual əsas sinifdə virtual funksiyaları elan etmək üçün istifadə olunur. Bu, işləmə vaxtında (runtime polymorphism) çoxşaxəliliyi həyata keçirməyə imkan verir.
Tətbiq:
- Əsas sinifdə, törəmə sinflərdə (override) yenidən yaza bilən funksiya təyin edir.
- Virtual funksiya, əsas sinfə işarə edən göstərici və ya istinad vasitəsilə çağırıldıqda, əslində, törəmə sinif obyektindəki funksiya çağırılır (əgər yenidən yazılıbsa). Bu, işləmə vaxtında virtual funksiyalar cədvəli (vtable) vasitəsilə həyata keçirilir.
Əsas nöqtələr:
- Yalnız sinif üzvü funksiyalar virtual ola bilər. Qlobal funksiyalar, statik funksiyalar və konstruktörlər virtual ola bilməz.
- Destruktorlar və vaxt-vaxtda virtual olmalı və olmalıdır ki, əsas sinfə işarə edən göstərici ilə törəmə sinif obyektləri silinərkən yaddaş sızması qarşısını alsın.
- Əgər funksiya əsas sinifdə
virtualkimi elan olunubsa, o, avtomatik olaraq bütün törəmə siniflərdə virtual qalır, həttavirtualsözündən istifadə edilməsə də (lakinvirtualvəoverrideistifadə etmək tövsiyə olunur). - Təmiz virtual funksiyalar
= 0ilə elan olunur və sinfi abstrakt edir. Belə sinfi birbaşa nümunə götürmək olmaz.
Nümunə:
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "Base-dən" << std::endl;
}
virtual ~Base() {
std::cout << "Base destruktor" << std::endl;
}
};
class Derived : public Base {
public:
void print() override { // override istifadə edilərək aydın şəkildə yenidən yazma
std::cout << "Derived-dən" << std::endl;
}
~Derived() override { // override istifadə edilərək
std::cout << "Derived destruktor" << std::endl;
}
};
int main() {
Base* ptr = new Derived(); // əsas sinfə işarə edən göstərici, törəmə obyektinə işarə edir
ptr->print(); // virtual funksiya sayəsində Derived::print() çağırılır
delete ptr; // Derived və Base destruktorları çağırılır, virtual destruktor sayəsində
return 0;
}
Əlaqəli anlayışlar:
- vtable (virtual funksiyalar cədvəli): Sinifin virtual funksiyalarına işarə edən göstəricilərin cədvəli. Hər bir virtual funksiyaya malik obyekt, görünməz vptr göstəricisini özündə saxlayır və bu, vtable-ə işarə edir.
- vptr (vtable göstəricisi): İş vaxtında çağırılacaq funksiyanı müəyyən etmək üçün lazımdır.
= 0(təmiz virtual funksiya): Bu funksiyanın bu sinifdə tətbiqi olmadığını göstərir və sinfi abstrakt edir.override(yenidən yazma göstəricisi): Bu, açıq şəkildə bildirir ki, törəmə sinifdəki funksiya, əsas sinifin virtual funksiyasını yenidən yazır. Xətaları aşkar etməyə kömək edir.final(göstərici): Virtual funksiyanın daha da yenidən yazılmasını və ya sinfin miras alınmasını qadağan edir.
Qısaca: virtual, C++-da irsi və dinamik bağlama vasitəsilə çoxşaxəliliyi həyata keçirmək üçün əsas mexanizmdir.