- C语言实现多态的关键在于
void*
类型指针,其可接收任意类型指针,
#include <stdio.h>
#include <stdlib.h>
typedef int (*FUNC_T)(void*, int);
typedef struct Base
{
FUNC_T _func;
int _val;
} Base;
int BaseRun(void* self, int num)
{
return ((Base*)self)->_val + num;
}
Base* BaseConstruct(int val)
{
Base* p = malloc(sizeof(Base));
p->_func = BaseRun;
p->_val = val;
return p;
}
typedef struct Derived
{
FUNC_T _func;
int _val;
} Derived;
int DerivedRun(void* self, int num)
{
return ((Derived*)self)->_val * num;
}
Derived* DerivedConstruct(int val)
{
Derived *p = malloc(sizeof(Derived));
p->_func = DerivedRun;
p->_val = val;
return p;
}
int Run(Base* p, int num)
{
return p->_func(p, num);
}
int main()
{
Base *base = BaseConstruct(10);
Base *derived = (Base*)DerivedConstruct(20);
int base_run_ret = Run(base, 10);
int derived_run_ret = Run(derived, 10);
printf("base_run_ret: %d, derived_run_ret: %d\n", base_run_ret, derived_run_ret);
return 0;
}