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"
}

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