Sobes.tech
Junior — Middle

რა შედეგები შეიძლება გამოიწვიოს ობიექტის დესტრუქტორის დროს ვირტუალურ ფუნქციას გამოძახებისას?

sobes.tech AI

პასუხი AI-სგან

C++-да объектинин деструкторунда виртуалдуу функция чакырылганда, ал функциянын версиясы, объекттин учурдагы түрүнө ылайык, ал эми мурас класстагы эмес. Бул, деструктор иштеп жатканда объект алгачкы класска "кыскарат" жана виртуалдуу чакыруулар механизми мурас класстарды эске албайт.

Жыйынтыктары:

  • Эгер виртуалдуу функция мурас класста кайра жазылган болсо, анда негизги класстын деструкторунда чакырылганда, ал кайра жазылган версия эмес, негизги версия чакырылат.
  • Бул функция мурас класстын абалынан көз каранды болсо жана ал азыркы учурда жок кылынган болсо, күтүлбөгөн жүрүм-турумга же каталарга алып келиши мүмкүн.

Мисал:

#include <iostream>

struct Base {
    virtual ~Base() {
        foo(); // виртуалдуу функцияны чакыруу
    }
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
};

struct Derived : Base {
    ~Derived() override {
        std::cout << "Derived деструктору" << std::endl;
    }
    void foo() override { std::cout << "Derived::foo" << std::endl; }
};

int main() {
    Base* obj = new Derived();
    delete obj; // Base::~Base() чакырылат, анын ичинде foo() Base::foo чакырылат
}

Жыйынтык:

Derived деструктор
Base::foo

Ошентип, виртуалдуу функцияны деструктор ичинде чакырганда, ал мурас класстагы кайра жазылган версияны чакырбайт.