Junior
Шумо дар бораи калимаи калидии virtual дар C++ чӣ медонед?
sobes.tech AI
Ҷавоб аз AI
virtual дар C++ барои эълон кардани функсияҳои виртуалӣ дар синфи асосӣ истифода мешавад. Ин имкон медиҳад, ки полиморфизм дар вақти иҷро (runtime polymorphism) амалӣ карда шавад.
Барнома:
- Функсияро дар синфи асосӣ муайян мекунад, ки метавонад дар синфҳои фарзандаш (override) нависад.
- Вақте ки функсияи виртуалӣ тавассути ишора ё истинод ба синфи асосӣ даъват мешавад, дар асл дар объекти синфи фарзанда (агар он дар он навишта шудааст) даъват карда мешавад. Ин дар вақти иҷро тавассути ҷадвали функсияҳои виртуалӣ (vtable) сурат мегирад.
Мавзӯъҳои асосӣ:
- Виртуалӣ метавонанд танҳо функсияҳои узви синф бошанд. Функсияҳои глобалӣ, функсияҳои статикӣ ва конструкторҳо наметавонанд виртуалӣ бошанд.
- Деструкторҳо метавонанд ва бояд виртуалӣ бошанд, то аз рехтани хотира дар вақти тоза кардани объектҳои синфи фарзанда тавассути ишора ба синфи асосӣ пешгирӣ шавад.
- Агар функсия дар синфи асосӣ
virtualэълон карда шавад, он худ ба худ дар ҳамаи синфҳои фарзанда виртуалӣ мемонад, ҳатто агар он ҷоvirtualистифода нашуда бошад (гарчанде ки тавсия дода мешавад, ки барои равшанӣvirtualваoverrideдар синфҳои фарзанда равшан нишон дода шаванд). - Функсияҳои тоза-virtual бо
= 0эълон карда мешаванд ва синфро абстрактӣ месозанд. Ин гуна синф мустақиман намебошад.
Масал:
#include <iostream>
class Base {
public:
virtual void print() {
std::cout << "From Base" << std::endl;
}
virtual ~Base() {
std::cout << "Base destructor" << std::endl;
}
};
class Derived : public Base {
public:
void print() override { // Истифодаи override барои нишон додани равшанӣ
std::cout << "From Derived" << std::endl;
}
~Derived() override { // Истифодаи override
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Base* ptr = new Derived(); // ишора ба синфи асосӣ ба объекти синфи фарзанда ишора мекунад
ptr->print(); // Бо сабаби функсияи виртуалӣ, Derived::print() даъват мешавад
delete ptr; // Деструкторҳои Derived ва сипас Base даъват мешаванд бо сабаби деструктори виртуалӣ
return 0;
}
Масоили вобаста:
- vtable (таблиғи функсияҳои виртуалӣ): Таблиғи ишораҳо ба функсияҳои виртуалӣ дар синф. Ҳар объекте, ки функсияҳои виртуалӣ дорад, дорои ишорае (vptr) ба vtable-и синфи худ мебошад.
- vptr (ишора ба vtable): Барои муайян кардани функсия дар вақти иҷро зарур аст.
= 0(функсияи виртуалӣ тоза): Манзур аст, ки функсия дар ин синф иҷроношуда аст, ва онро синфи абстрактӣ месозад.override(навиштани нав): Ба равшанӣ нишон медиҳад, ки функсия дар синфи фарзанда функсияи виртуалӣ дар синфи асосиро навиштааст. Ин кӯмак мекунад, ки хатоҳо дар сигнатураи функсия пайдо нашаванд.final(охир): Манъ мекунад, ки функсияи виртуалӣ дар оянда навишта шавад ё аз он синф наследӣ шавад.
Хулоса: virtual асосӣ механизм барои амалӣ кардани полиморфизм тавассути наследӣ ва пайвандкунии динамикӣ дар C++ мебошад.