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é.