Última actualización:2026-10-12
Implementar el polimorfismo de C++ en lenguaje C¶
Sobre el autor:¶
Cuenta pública personal de WeChat:

1. Ejemplo de implementación en C++¶
El polimorfismo en C++: en C++ se mantiene una tabla de funciones virtuales y, según las reglas de compatibilidad de asignación, sabemos que un puntero o referencia a la clase padre puede apuntar a objetos de la clase hija.
Si un puntero o referencia a la clase padre llama a una función virtual de la clase padre, ese puntero a la clase padre buscará la dirección de su propia función en su tabla de funciones virtuales; si ese puntero o referencia al objeto de la clase padre apunta a un objeto de la clase hija, y esa clase hija ha sobrescrito la función virtual de la clase padre, entonces el puntero llamará a la función virtual sobrescrita de la clase hija.
Para ver el código del ejemplo de estudio, consulta: c++_examp.cpp
2. Implementación en C¶
- Encapsulación
En el lenguaje C no existe el concepto de clase (class), pero sí la estructura (struct), que podemos usar para simularla;
usando punteros a funciones, encapsulamos atributos y métodos dentro de la estructura.
- Herencia
Anidamiento de estructuras
- Polimorfismo
Los punteros a funciones de los métodos de la clase y de la subclase son distintos
Dentro de una estructura del lenguaje C no hay funciones miembro; ¿cómo implementar entonces una función compartida por la estructura padre y la estructura hija? Podemos usar punteros a funciones para simularlo. Pero este enfoque tiene un defecto: los punteros a funciones del padre y del hijo no apuntan a algo similar a la tabla de funciones virtuales que mantiene C++, sino a un bloque de memoria física, de modo que si se simulan demasiadas funciones, el mantenimiento se vuelve complicado.
Para simular el polimorfismo, las variables puntero a función deben mantenerse alineadas (completamente coincidentes en contenido y también en la alineación de las variables). De lo contrario, ¡si un puntero a la clase padre apunta a un objeto de la clase hija, el programa se bloqueará en tiempo de ejecución!
Para ver el código del ejemplo de estudio, consulta: c_examp.c
Temas relacionados¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事
- C++ restrict y optimización del compilador | C++那些事