0Pricing
C++ Academy · Aula

Funções virtuais e a vtable

Implemente polimorfismo em tempo de execução com funções virtuais e examine o conceito de vtable

Funções virtuais e a vtable é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.

Vinculação Estática versus Dinâmica

Por padrão, as chamadas de membros são vinculadas estaticamente — o compilador escolhe a função com base no tipo declarado. Com funções virtual, a chamada é vinculada dinamicamente com base no tipo real.

Declarando uma Função virtual

Marque a função como virtual na classe base. As classes derivadas podem substituí-la.

class Shape {
public:
    virtual double area() const = 0;        // pure virtual
    virtual ~Shape() = default;
};

class Circle : public Shape {
    double r_;
public:
    Circle(double r) : r_(r) {}
    double area() const override { return 3.14159 * r_ * r_; }
};

O Especificador override

Adicione override aos métodos derivados. O compilador verifica se a função realmente substitui uma função virtual, detectando erros de digitação na assinatura.

O Especificador final

final impede novas substituições. Utilize-o em classes das quais não se deve herdar ou em métodos que não devem ser substituídos novamente.

class Concrete final : public Base { /* ... */ };
class Base {
    virtual void f() final;   // cannot be overridden
};

Chamando por Meio de um Ponteiro para a Classe Base

A magia do polimorfismo: um ponteiro para a classe base pode encaminhar a chamada para o método derivado correto.

Shape* s = new Circle(3.0);
std::cout << s->area();   // 28.27... (Circle::area)
delete s;

O Conceito de Tabela Virtual

Cada classe polimórfica possui uma tabela virtual oculta — uma tabela de ponteiros para funções. Cada objeto contém um ponteiro oculto para a tabela virtual de sua classe.

Custo das Chamadas Virtuais

Uma chamada virtual envolve uma indireção extra pela tabela virtual. Isso é insignificante na maior parte do código. Evite chamadas virtuais em loops internos se as medições mostrarem que elas são um gargalo.

Funções Puramente Virtuais

Acrescente = 0 para tornar uma função puramente virtual. As classes derivadas precisam substituí-la para poderem ser instanciadas. A classe se torna abstrata.

Destrutores Virtuais

Se uma classe tiver qualquer função virtual ou se for destinada a ser excluída por meio de um ponteiro para a classe base, forneça-lhe um destrutor virtual. Caso contrário, o destrutor da classe derivada nunca será executado.

class Base {
public:
    virtual ~Base() = default;   // safe to delete through Base*
};

Polimorfismo com Ponteiros Inteligentes

Mantenha objetos polimórficos em ponteiros inteligentes para a classe base. O ponteiro inteligente gerencia a destruição corretamente.

std::unique_ptr<Shape> s = std::make_unique<Circle>(3.0);

Revisitando o Fatiamento

Passar um objeto derivado por valor para uma função que espera a classe base remove a parte derivada. Utilize referências ou ponteiros para parâmetros polimórficos.

Compromisso de Desempenho

Funções virtuais adicionam flexibilidade com um pequeno custo em tempo de execução. Modelos oferecem polimorfismo em tempo de compilação sem custo em tempo de execução — escolha com base na necessidade de polimorfismo durante a execução.

Verificação Rápida

Por que uma classe base polimórfica deve ter um destrutor virtual?

Recapitulação

Funções virtuais possibilitam o polimorfismo em tempo de execução por meio de uma tabela virtual por classe. Marque as substituições com override e impeça novas heranças com final. Sempre forneça um destrutor virtual às classes base polimórficas.

Perguntas Frequentes

A aula “Funções virtuais e a vtable” é grátis?

Sim — o texto completo de “Funções virtuais e a vtable” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.

O que vou aprender em “Funções virtuais e a vtable”?

Implemente polimorfismo em tempo de execução com funções virtuais e examine o conceito de vtable Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C++ Academy?

Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Funções virtuais e a vtable”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C++ Academy?

Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Herança simples e múltipla
  2. Funções virtuais e a vtable
  3. Classes abstratas e métodos virtuais puros
  4. Herança versus composição: compromissos
← Voltar para C++ Academy