Junior
Ką žinote apie raktažodį virtual C++?
sobes.tech AI
Atsakymas iš AI
virtual C++-да naudojamas virtualių funkcijų deklaravimui baziniame klasėje. Tai leidžia įgyvendinti polimorfizmą vykdymo metu (runtime polymorphism).
Naudojimas:
- Apibrėžia funkciją baziniame klasėje, kurią galima perrašyti (override) išvestiniuose klasėse.
- Kai virtuali funkcija kviečiama per rodyklę arba nuorodą į bazinį klasę, iš tikrųjų kviečiama funkcijos realizacija iš išvestinio objekto (jei ji ten perrašyta). Tai vyksta vykdymo metu per virtualių funkcijų lentelę (vtable).
Pagrindiniai punktai:
- Virtualios gali būti tik klasės narės funkcijos. Globalios funkcijos, statinės narės funkcijos ir konstruktoriai negali būti virtualūs.
- Destruktoriai gali ir dažnai turėtų būti virtualūs, kad išvengtume atminties nutekėjimo ištrynus išvestinių klasių objektus per bazinio klasės rodyklę.
- Jei funkcija deklaruota kaip
virtualbaziniame klasėje, ji automatiškai lieka virtuali visuose išvestiniuose klasiuose, net jei ten nėra aiškiai nurodytavirtual(nors rekomenduojama aiškiai nurodytivirtualiroverrideišvestinėse klasėse). - Tiesioginės virtualios funkcijos deklaruojamos su
= 0ir padaro klasę abstrakčią. Tokios klasės tiesiogiai instancijuoti negalima.
Pavyzdys:
#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 { // Naudojant override aiškiai nurodyti perrašymą
std::cout << "From Derived" << std::endl;
}
~Derived() override { // Naudojant override
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Base* ptr = new Derived(); // Bazinis klasės rodyklė rodo į išvestinį objektą
ptr->print(); // Kviečiama Derived::print() dėl virtualios funkcijos
delete ptr; // Kviečiami Derived ir tada Base destruktoriai dėl virtualaus destruktoriaus
return 0;
}
Susiję sąvokos:
- vtable (virtualių funkcijų lentelė): Lentelė su rodyklėmis į virtualias funkcijas klasėje. Kiekvienas su virtualiomis funkcijomis objektas turi nematomą rodyklę (vptr) į savo klasės vtable.
- vptr (vtable rodyklė): Reikalinga funkcijos kvietimui vykdymo metu.
= 0(švari virtuali funkcija): Reiškia, kad funkcija neturi realizacijos šiame klasėje, todėl ji yra abstrakti.override(perrašymas): Aiškiai nurodo, kad funkcija išvestinėje klasėje perrašo bazinės klasės virtualią funkciją. Padeda kompiliatoriui rasti klaidas, jei funkcijos parašas nesutampa.final(pabaiga): Draudžia tolesnį virtualios funkcijos perrašymą ar paveldėjimą iš klasės.
Trumpai: virtual yra pagrindinis mechanizmas polimorfizmo įgyvendinimui per paveldėjimą ir dinaminį funkcijų sujungimą C++ kalboje.