C语言实现多态
//父类虚表
typedef struct vtlbA
{
void (*pfun1)();
}vtlbA;
//子类虚表
typedef struct vtlbB
{
vtlbA vtbl;
void (*pfun2_B)();
}vtlbB;
虚表内存布局如下:
//父类虚函数
void fun1()
{
printf("父类fun1\n");
}
//子类重写父类虚函数fun1
void fun1_B()
{
printf("子类重写fun1\n");
}
//子类特有函数
void fun2_B(int)
{
printf("子类特有fun2\n");
}
//父类
typedef struct A
{
vtblA* pvtl;// 父类虚表指针
int a; // 父类数据成员
}
//子类
typedef struct B
{
A base_a; // 从父类继承而来的基类A
int b; // 子类数据成员
}B;
类内存布局如下:
// 父类虚表结构
vtblA g_vtbl_A = {&fun1};
// 子类虚表结构
vtblB g_btbl_B = { {&fun1_B}, &fun2_B };
// 父类构造函数
void init_A(A* pa)
{
pa->a = 10;
pa->pvtl = &g_vtbl_A;
}
// 子类构造函数
void init_B(B* pb)
{
init_A((A*)pb);
pb->base_a.pvtl = (vtblA*)&g_btbl_B;
pb->b = 20;
}
构造函数执行之后内存布局如下:
// 测试多态函数
void dosomething(A* p)
{
// 如果p指向子类对象那么输出结果就是重写后的函数pfun1
vtblA* pvtbl = (vtblA*)p->pvtl;
(*pvtbl).pfun1();
}
int main()
{
// 定义子类对象并构造
B b;
init_B(&b);
// 调用父类自己的函数
vtblB* pvtvl = (vtblB*)b.base_a.pvtl;
(*pvtvl).fun2_B(5);
// 定义父类指针
A* pa = (A*)&b;
// 测试多态
dosomething(pa);
return 0;
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至yj.mapple@gmail.com
文章标题:C语言实现多态
文章字数:311
本文作者:melonshell
发布时间:2020-04-04, 22:24:15
最后更新:2020-04-05, 00:26:01
原始链接:http://melonshell.github.io/2020/04/04/go12_C_Polymorphism/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。