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"
}
Հետևաբար, վիրտուալ մեթոդների կանչերը կոնստրուկտորների և դեստրուկտորների մեջ միշտ կատարվում են ընթացիկ դասի կոնտեքստում, ոչ ժառանգված դասի։