Sobes.tech
Junior — Middle

V čom spočíva špecifikácia volania virtuálnych metód v konštruktore triedy?

sobes.tech AI

Odpoveď od AI

Keď sa volajú virtuálne metódy vnútri konštruktora triedy v C++, nastáva špecifická situácia: virtuálne volania nefungujú ako zvyčajne. Počas vykonávania konštruktora ukazuje virtuálna tabuľka (vtable) na metódy aktuálnej triedy, nie na tie prepísané v odvodených triedach.

To znamená, že ak v konštruktore základnej triedy zavoláte virtuálnu metódu, bude zavolaná presne metóda základnej triedy, aj keď bola prepísaná v odvodenom type. Toto je urobené na to, aby sa zabránilo volaniu metód, ktoré môžu závisieť od častí objektu, ktoré ešte neboli inicializované.

Príklad:

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; // Vypíše "Base::foo", nie "Derived::foo"
}

Pretože volanie virtuálnych metód v konštruktoch a destruktoch sa vždy vykonáva v kontexte aktuálnej triedy, nie odvodené.