Sobes.tech
Junior — Middle

¿En qué consiste la especificidad de llamar a métodos virtuales dentro del constructor de una clase?

sobes.tech AI

Respuesta de la IA

Al llamar a métodos virtuales dentro del constructor de una clase en C++ ocurre una particularidad: las llamadas virtuales no funcionan como de costumbre. Durante la ejecución del constructor, la tabla virtual (vtable) apunta a los métodos de la clase actual, no a los sobrescritos en las clases derivadas.

Esto significa que si dentro del constructor de la clase base se llama a un método virtual, se llamará exactamente el método de la clase base, incluso si en la clase derivada ha sido sobrescrito. Esto se hace para evitar llamadas a métodos que podrían depender de partes del objeto que aún no han sido inicializadas.

Ejemplo:

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; // Imprimirá "Base::foo", no "Derived::foo"
}

Por lo tanto, la llamada a métodos virtuales en constructores y destructores siempre se realiza en el contexto de la clase actual, no de la clase derivada.