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