Virtual function em C++

Virtual function é uma função que pode ser sobrescrita numa herança de classes por outra função com a mesma assinatura.

class A {
public:
    int num() { return 1; }
}

class B: public A {
public:
    int num() { return 2; }
}

int main() {
    A* a = new A();
    A* b = new B();
    std::cout << "A num is " << a->num() << std::endl;
    std::cout << "B num is " << b->num() << std::endl;
}

O resultado é:

A num is 1
B num is 1

Por que?

Note que a e b são declarados ponteiros de A. Entretanto, b inicializa B. Isso está correto. Você pode se referir a classe derivada usando ponteiro da classe base.

Mas quando usamos b->num(), o compilador obedientemente usa A::num(), que corresponde ao tipo declarado de b.

Declare virtual

class A {
public:
    virtual int num() { return 1; }
}

É o resultado será

A num is 1
B num is 2

A diferença é que virtual diz ao compilador para não usar o tipo declarado, mas sim a “tabela de funções virtuais” criada por ele.

Então, sempre que precisar modificar uma função da classe base, declare-a virtual. Numa herança de 3 níveis ou mais, você pode encerrar a sobrescrita usando final.

E por que todas as funções não são virtual por padrão? Em PHP e Java, métodos públicos e protegidos podem ser sobrescritos sempre que não sejam definidos final. Logo são “virtual”. Estamos diante de uma inversão de padrões.

Um dos princípios principais do C++ é: você paga somente pelo o que você usa (zero overhead principle). Se você não precisa de um mecanismo dinâmico de despache, você não pagará por isso.

E, como autor da classe base, você deve decidir quais métodos podem ser sobrescritos. Projete para a herança ou para proibi-la.

You may also like...