Junior
Ko jūs zināt par vārdu virtual C++?
sobes.tech AI
Atbilde no AI
virtual C++ tiek izmantots virtuālo funkciju deklarēšanai bāzes klasē. Tas ļauj īstenot polimorfismu izpildes laikā (runtime polymorphism).
Pielietojums:
- Definē funkciju bāzes klasē, kuru var pārdefinēt (override) apakšklasēs.
- Kad virtuāla funkcija tiek izsaukta caur rādītāju vai atsauci uz bāzes klasi, faktiski tiek izsaukta funkcijas realizācija apakšklases objektā (ja tā ir pārdefinēta). Tas notiek izpildes laikā, izmantojot virtuālo funkciju tabulu (vtable).
Galvenie punkti:
- Virtuālas var būt tikai klases locekļu funkcijas. Globālas funkcijas, statiskas locekļu funkcijas un konstruktori nevar būt virtuālas.
- Destruktori var un bieži jābūt virtuāliem, lai izvairītos no atmiņas noplūdēm, dzēšot apakšklases objektus caur rādītāju uz bāzes klasi.
- Ja funkcija ir deklarēta kā
virtualbāzes klasē, tā automātiski paliek virtuāla visās apakšklasēs, pat ja tur nav tieši norādītsvirtual(lai gan ieteicams to skaidri norādīt arvirtualunoverride). - Tīras virtuālas funkcijas tiek deklarētas ar
= 0un padara klasi abstraktu. Šādu klasi tieši nevar instancēt.
Piemērs:
#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 { // Izmantojot override, lai skaidri norādītu pārklāšanu
std::cout << "From Derived" << std::endl;
}
~Derived() override { // Izmantojot override
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Base* ptr = new Derived(); // Rādītājs uz bāzes klasi norāda uz apakšklases objektu
ptr->print(); // Izsaukts Derived::print() dēļ virtuālās funkcijas
delete ptr; // Izsaukts Derived un tad Base destruktors, pateicoties virtuālajam destruktoram
return 0;
}
Saistītie jēdzieni:
- vtable (virtuālo funkciju tabula): Tabula ar rādītājiem uz virtuālajām funkcijām klasē. Katrs objekts ar virtuālajām funkcijām satur neredzamu rādītāju (vptr) uz savas klases vtable.
- vptr (vtable rādītājs): Nepieciešams funkcijas izsaukšanai izpildes laikā.
= 0(tīra virtuāla funkcija): Norāda, ka funkcijai nav realizācijas šajā klasē, padarot to par abstraktu.override(pārklāšana): Skaidri norāda, ka apakšklases funkcija pārklāj bāzes klases virtuālo funkciju. Palīdz kompilatoram atrast kļūdas, ja funkcijas paraksts nesakrīt.final(beigas): Aizliedz turpmāku virtuālas funkcijas pārklāšanu vai mantošanu no klases.
Īsumā: virtual ir galvenais mehānisms polimorfisma īstenošanai caur mantošanu un dinamisko saistīšanu funkcijām C++.