Sobes.tech
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++ мебошад.