Sobes.tech
Junior — Middle

Qual é a especificidade de chamar métodos virtuais dentro do construtor de uma classe?

sobes.tech IA

Resposta da IA

Ao chamar métodos virtuais dentro do construtor de uma classe em C++, ocorre uma particularidade: as chamadas virtuais não funcionam como de costume. Durante a execução do construtor, a tabela virtual (vtable) aponta para os métodos da classe atual, não para os sobrescritos nas classes derivadas.

Isto significa que, se dentro do construtor da classe base for chamado um método virtual, será chamado exatamente o método da classe base, mesmo que tenha sido sobrescrito na classe derivada. Isto é feito para evitar chamadas a métodos que possam depender de partes do objeto que ainda não foram inicializadas.

Exemplo:

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; // Vai imprimir "Base::foo", não "Derived::foo"
}

Portanto, chamadas de métodos virtuais em construtores e destrutores sempre ocorrem no contexto da classe atual, e não da classe derivada.