C语言多态与继承
C语言多态与继承
void *与函数指针、结构体是c语言能实现继承与多态的重要组成部分。
void *:万能的指针
int * 叫做指向整型的指针,而 char * 是指向字符型的指针等等。
而 void *,不要按照通常的命名方式叫它做指向 void 类型的指针,它的正式的名字叫做:可以指向任意类型的指针。
函数指针:指向函数的指针
示例代码:
#include <stdio.h> #include <stdlib.h> //虚函数表结构 struct base_vtbl { void(*dance)(void *); void(*jump)(void *); }; //基类 struct base { /*virtual table*/ struct base_vtbl *vptr; }; void base_dance(void *this) { printf("base dance\n"); } void base_jump(void *this) { printf("base jump\n"); } /* global vtable for base */ struct base_vtbl base_table = { base_dance, base_jump }; //基类的构造函数 struct base * new_base() { struct base *temp = (struct base *)malloc(sizeof(struct base)); temp->vptr = &base_table; return temp; } //派生类 struct derived1 { struct base super; /*derived members */ int high; }; void derived1_dance(void * this) { /*implementation of derived1's dance function */ printf("derived1 dance\n"); } void derived1_jump(void * this) { /*implementation of derived1's jump function */ struct derived1* temp = (struct derived1 *)this; printf("derived1 jump:%d\n", temp->high); } /*global vtable for derived1 */ struct base_vtbl derived1_table = { (void(*)(void *))&derived1_dance, (void(*)(void *))&derived1_jump }; //派生类的构造函数 struct derived1 * new_derived1(int h) { struct derived1 * temp= (struct derived1 *)malloc(sizeof(struct derived1)); temp->super.vptr = &derived1_table; temp->high = h; return temp; } int main(void) { struct base * bas = new_base(); //这里调用的是基类的成员函数 bas->vptr->dance((void *)bas); bas->vptr->jump((void *)bas); struct derived1 * child = new_derived1(100); //基类指针指向派生类 bas = (struct base *)child; //这里调用的其实是派生类的成员函数 bas->vptr->dance((void *)bas); bas->vptr->jump((void *)bas); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?