Sobes.tech
Junior — Middle

Sinf konstruktorida virtual metodlarni chaqirishning o'ziga xosligi nima?

sobes.tech AI

AIdan javob

C++ da bir sinfning konstruktorida virtual metodlarni chaqirishda o'ziga xos holat yuzaga keladi: virtual chaqiruvlar odatdagidek ishlamaydi. Ob'ekt konstruktorini bajarish vaqtida, virtual jadval (vtable) hozirgi sinf metodlariga ishora qiladi, meros olgan sinflarda qayta yozilganlarga emas.

Bu shuni anglatadiki, agar asosiy sinfning konstruktorida virtual metod chaqirilsa, u aynan asosiy sinf metodini chaqiradi, hatto u meros olgan sinfda qayta yozilgan bo'lsa ham. Bu, ob'ektning hali to'liq ishga tushirilmagan qismlariga bog'liq bo'lishi mumkin bo'lgan metodlarni chaqirishni oldini olish uchun qilingan.

Misol:

class Base {
public:
    Base() { foo(); }
    virtual void foo() { std::cout << "Base::foo" << std::endl; }
};

class Derived : public Base {
public:
    Derived() : Base() {}
    void foo() override { std::cout << "Derived::foo" << std::endl; }
};

int main() {
    Derived d; // "Base::foo" chiqaradi, "Derived::foo" emas
}

Shuning uchun, konstruktorlar va destruktorlar ichida virtual metodlar chaqirilishi har doim joriy sinf kontekstida, meros olgan sinf kontekstida emas, amalga oshiriladi.