Última atualização:2026-10-12
Implementando polimorfismo de C++ em linguagem C¶
Sobre o autor:¶
Conta oficial do WeChat:

1.Exemplo de implementação em C++¶
Polimorfismo em C++: o C++ mantém uma tabela de funções virtuais e, pelas regras de compatibilidade de atribuição, sabemos que um ponteiro ou referência da classe base pode apontar para um objeto da classe derivada.
Se um ponteiro ou referência da classe base chama uma função virtual da classe base, esse ponteiro da classe base procura o endereço da função em sua própria tabela de funções virtuais; se esse ponteiro ou referência da classe base aponta para um objeto da classe derivada, e essa classe derivada sobrescreveu a função virtual da classe base, então o ponteiro chamará a função virtual já sobrescrita na classe derivada.
O código de exemplo está em: c++_examp.cpp
2.Implementação em C¶
- Encapsulamento
A linguagem C não tem o conceito de classe (class), mas tem estruturas (struct), que podemos usar para simulá-lo;
Usamos ponteiros de função para encapsular atributos e métodos dentro da estrutura.
- Herança
Estruturas aninhadas
- Polimorfismo
Os ponteiros de função dos métodos da classe e da subclasse são diferentes
Dentro de uma estrutura da linguagem C não há funções membro; como implementar, então, uma função compartilhada entre a estrutura "pai" e a estrutura "filha"? Podemos usar ponteiros de função para simular. Essa abordagem, porém, tem uma deficiência: os ponteiros de função do pai e do filho não apontam para algo semelhante à tabela de funções virtuais mantida pelo C++, mas para um bloco de memória física; se houver muitas funções simuladas, a manutenção fica difícil.
Para simular o polimorfismo, as variáveis de ponteiro de função devem permanecer alinhadas (totalmente idênticas em conteúdo e também no alinhamento das variáveis). Caso contrário, o ponteiro da classe base apontando para um objeto da classe derivada causará uma falha na execução!
O código de exemplo está em: c_examp.c
Tópicos relacionados¶
- Funções virtuais puras e classes abstratas em C++ | C++那些事
- Asserções com assert em C++ | C++那些事
- Bit fields em C++ | C++那些事
- Constantes e modificadores com const em C++ | C++那些事
- A família completa do const em C++ | C++那些事
- O operador de desreferência * em C++ | C++那些事
- Inicialização e atribuição em C++ | C++那些事
- Formas de retornar múltiplos valores em C++ | C++那些事
- A palavra-chave mutable em C++ | C++那些事
- C++ restrict e otimização do compilador | C++那些事