Mi a virtuális metódusok hívásának sajátossága egy osztály konstruktorán belül?
sobes.tech MI
Válasz az MI-től
Amikor virtuális módszereket hívunk meg egy osztály konstruktorán belül C++-ban, egy különleges helyzet áll elő: a virtuális hívások nem működnek szokás szerint. A konstruktor futása közben a virtuális tábla (vtable) a jelenlegi osztály metódusaira mutat, nem az örökölt osztályban felülírtakra.
Ez azt jelenti, hogy ha az alap osztály konstruktorán belül virtuális metódust hívunk, akkor pontosan az alap osztály metódusa lesz meghívva, még akkor is, ha az örökölt osztályban felülírták. Ezt azért teszik, hogy elkerüljék az olyan metódusok hívását, amelyek még nem inicializált részekre támaszkodhatnak.
Példa:
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; // Kiírja "Base::foo", nem "Derived::foo"
}
Ezért a virtuális metódushívások a konstruktorokban és destruktorokban mindig a jelenlegi osztály kontextusában történnek, nem az örökölt osztályéban.