Sobes.tech
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 virtual baziniame klasėje, ji automatiškai lieka virtuali visuose išvestiniuose klasiuose, net jei ten nėra aiškiai nurodyta virtual (nors rekomenduojama aiškiai nurodyti virtual ir override išvestinėse klasėse).
  • Tiesioginės virtualios funkcijos deklaruojamos su = 0 ir 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.