Sobes.tech
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ā virtual bāzes klasē, tā automātiski paliek virtuāla visās apakšklasēs, pat ja tur nav tieši norādīts virtual (lai gan ieteicams to skaidri norādīt ar virtual un override).
  • Tīras virtuālas funkcijas tiek deklarētas ar = 0 un 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++.