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
- Herança simples e múltipla
- Funções virtuais e a vtable
- Classes abstratas e métodos virtuais puros
- Herança versus composição: compromissos