Sobes.tech
Junior — Middle

Ի՞նչ է դասի կոնստրուկտորում վիրտուալ մեթոդների կանչի առանձնահատկությունը։

sobes.tech AI

Պատասխան AI-ից

Երբ վիրտուալ մեթոդներ կանչվում են C++-ում դասի կոնստրուկտորում, տեղի է ունենում հատուկ դեպք. վիրտուալ կանչերը չեն աշխատում սովորականի նման: Կոնստրուկտորի ժամանակ, վիրտուալ սեղան (vtable) ցույց է տալիս ընթացիկ դասի մեթոդներին, ոչ թե ժառանգված դասերում վերաշարադրվածներին:

Այսինքն, եթե բազային դասի կոնստրուկտորի մեջ կանչեք վիրտուալ մեթոդ, կկանչվի հենց բազային դասի մեթոդը, նույնիսկ եթե այն վերաշարադրված է ժառանգված դասում: Սա կատարվում է, որպեսզի կանխվի այն մեթոդների կանչը, որոնք կարող են կախված լինել դեռ չներկայացված օբյեկտի մասերից:

Օրինակ:

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", ոչ թե "Derived::foo"
}

Հետևաբար, վիրտուալ մեթոդների կանչերը կոնստրուկտորների և դեստրուկտորների մեջ միշտ կատարվում են ընթացիկ դասի կոնտեքստում, ոչ ժառանգված դասի։