关注
test.h
#ifndef _TEST_H_
#define _TEST_H_
typedef void Demo;
typedef void Derived;
Demo* Demo_Create(int i, int j);
int Demo_GetI(Demo* pThis);
int Demo_GetJ(Demo* pThis);
int Demo_Add(Demo* pThis, int value);
void Demo_Free(Demo* pThis);
Derived* Derived_Create(int i, int j, int k);
int Derived_GetK(Derived* pThis);
int Derived_Add(Derived* pThis, int value);
#endif
test.c
#include "test.h"
#include "malloc.h"
static int Demo_Virtual_Add(Demo* pThis, int value);
static int Derived_Virtual_Add(Demo* pThis, int value);
struct VTable // 2. 定义虚函数表数据结构
{
int (*pAdd)(void*, int); // 3. 虚函数表里面存储什么???
};
struct ClassDemo
{
struct VTable* vptr; // 1. 定义虚函数表指针 ==》 虚函数表指针类型???
int mi;
int mj;
};
struct ClassDerived
{
struct ClassDemo d;
int mk;
};
static struct VTable g_Demo_vtbl =
{
Demo_Virtual_Add
};
static struct VTable g_Derived_vtbl =
{
Derived_Virtual_Add
};
Demo* Demo_Create(int i, int j)
{
struct ClassDemo* ret = (struct ClassDemo*)malloc(sizeof(struct ClassDemo));
if( ret != NULL )
{
ret->vptr = &g_Demo_vtbl; // 4. 关联对象和虚函数表
ret->mi = i;
ret->mj = j;
}
return ret;
}
int Demo_GetI(Demo* pThis)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mi;
}
int Demo_GetJ(Demo* pThis)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mj;
}
// 6. 定义虚函数表中指针所指向的具体函数
static int Demo_Virtual_Add(Demo* pThis, int value)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->mi + obj->mj + value;
}
// 5. 分析具体的虚函数!!!!
int Demo_Add(Demo* pThis, int value)
{
struct ClassDemo* obj = (struct ClassDemo*)pThis;
return obj->vptr->pAdd(pThis, value);
}
void Demo_Free(Demo* pThis)
{
free(pThis);
}
Derived* Derived_Create(int i, int j, int k)
{
struct ClassDerived* ret = (struct ClassDerived*)malloc(sizeof(struct ClassDerived));
if( ret != NULL )
{
ret->d.vptr = &g_Derived_vtbl;
ret->d.mi = i;
ret->d.mj = j;
ret->mk = k;
}
return ret;
}
int Derived_GetK(Derived* pThis)
{
struct ClassDerived* obj = (struct ClassDerived*)pThis;
return obj->mk;
}
static int Derived_Virtual_Add(Demo* pThis, int value)
{
struct ClassDerived* obj = (struct ClassDerived*)pThis;
return obj->mk + value;
}
int Derived_Add(Derived* pThis, int value)
{
struct ClassDerived* obj = (struct ClassDerived*)pThis;
return obj->d.vptr->pAdd(pThis, value);
}
Main.c
#include "stdio.h"
#include "test.h"
void run(Demo* p, int v)
{
int r = Demo_Add(p, v);
printf("r = %d\n", r);
}
int main()
{
Demo* pb = Demo_Create(1, 2);
Derived* pd = Derived_Create(1, 22, 333);
printf("pb->add(3) = %d\n", Demo_Add(pb, 3));
printf("pd->add(3) = %d\n", Derived_Add(pd,
3));
run(pb, 3);
run(pd, 3);
Demo_Free(pb);
Demo_Free(pd);
return 0;
}
查看原帖
点赞 评论
相关推荐
10-16 21:30
广东工业大学 Java 点赞 评论 收藏
分享
10-14 15:17
门头沟学院 运营 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 实习在多还是在精 #
33528次浏览 237人参与
# 我的求职进度条 #
80783次浏览 1100人参与
# 平安产险科技校招 #
539次浏览 0人参与
# 你现在会用到哪些AI技能? #
4549次浏览 72人参与
# 实习下班不想学习,正常吗? #
18988次浏览 171人参与
# 秋招踩过的“雷”,希望你别再踩 #
79997次浏览 1049人参与
# 智慧芽求职进展汇总 #
1531次浏览 5人参与
# 你的房租占工资的比例是多少? #
64340次浏览 797人参与
# 你见过哪些工贼行为 #
15861次浏览 87人参与
# 你还有多少年退休? #
26497次浏览 192人参与
# 校招谈薪一定要知道的事 #
12569次浏览 112人参与
# 反问环节如何提问 #
114949次浏览 2452人参与
# 小马智行求职进展汇总 #
13346次浏览 49人参与
# 找工作中的小确幸 #
25310次浏览 258人参与
# 顺丰求职进展汇总 #
63103次浏览 313人参与
# 你觉得什么岗位会被AI替代 #
15728次浏览 174人参与
# 大厂VS公务员你怎么选 #
24140次浏览 356人参与
# 非技术岗投递进展 #
157714次浏览 1314人参与
# 如果不考虑收入,你最想做什么工作? #
32484次浏览 185人参与
# 总结:哪家公司面试体验感最好 #
69908次浏览 416人参与
# 金蝶求职进展汇总 #
53646次浏览 262人参与
# 在国企工作的人,躺平了吗? #
367858次浏览 3915人参与