Sobes.tech
Junior — Middle

Kāda ir virtuālo metošu izsaukšanas specifika klases konstruktorā?

sobes.tech AI

Atbilde no AI

Kad tiek virtuālas metodes tiek saukts konstruktora C++ valodā, ir raksturojums: virtuālas izsaukšanas nedarbojas kā parasti. Konstruktoru izpildes laikā virtuālā tabula (vtable) norāda uz pašreizējās klases metodēm, nevis uz tām, kas ir pārrakstītas mantošanas klasēs.

Tas nozīmē, ka, ja konstruktorā bāzes klases tiek izsaukta virtuāla metode, tiks izsaukta tieši bāzes klases metode, pat ja tā ir pārrakstīta mantošanas klasē. Tas ir darīts, lai novērstu metožu izsaukšanu, kas varētu būt atkarīgas no vēl neinitializētām objekta daļām.

Piemērs:

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; // Izvadīs "Base::foo", nevis "Derived::foo"
}

Tādēļ virtuālo metožu izsaukšana konstruktoros un destruktoros vienmēr notiek pašreizējās klases kontekstā, nevis mantošanas klasē.