1、C语言中通过函数指针实现C++中函数重载
我们都知道重载是c++面向对象的特性。c语言中是不存在的。所谓重载简单来说就是一个函数名可以实现不同的功能,要么输入参数不同或者参数个数不同,要么返回类型不同。例如函数add(),在c++中可以轻易实现int,double等不同类型参数的相加功能,而在c语言中却不能这样实现。c语言中实现重载功能,或者准确来说是类似重载的功能,可以通过函数指针的方式来实现。
下面为演示代码:
/*用c语言实现c++的多态
*
*这里主要是用c语言实现编译时的多态--重载
*例子:http://www.linuxidc.com/Linux/2012-07/66399.htm
*2013-5-23
*/
typedef struct
{
int a;
int b;
}INT_PARAM;
typedef struct
{
double a;
double b;
}DOUBLE_PARAM;
typedef void * (*addFunc)(void *);
void *int_add(void * param)
{
INT_PARAM * iparam = (INT_PARAM*)param;
int sum = iparam->a +iparam->b;
return (void*)∑
}
void * double_add(void *param)
{
DOUBLE_PARAM *dparam = (DOUBLE_PARAM*)param;
double sum = dparam->a+dparam->b;
return (void *)∑
}
void* add_func(addFunc f,void *param) //函数指针做形参
{
return f(param);
}
int main()
{
INT_PARAM m= {10,20};
DOUBLE_PARAM d={10.5,15.5};
void *sum1 = add_func(int_add,&m);
printf("%d\n",*(int *)sum1);
//cout<<*(int *)sum1<<endl;
void *sum2 = add_func(double_add,&d);
//cout<<*(double*)sum2<<endl;
printf("%d\n",*(int *)sum2);
system("pause");
return 0;
}
其实欲实现类似C++中的函数重载,在C中常常将参数类型加到函数名当中,如add_int,add_float等等。
2、利用C语言实现虚函数
link:http://bbs.csdn.net/topics/90227626
/*用c语言实现c++的多态
*这里主要是用c语言实现运行时的多态--虚函数
*在结构体中嵌套函数指针;
*例子:http://bbs.csdn.net/topics/90227626 #46 nntt的回答
*2013-5-23
*/
typedef struct
{
int (*myMaxMin)(int a, int b);
}Function;
int myMax(int a,int b)
{
return (a>b? a:b);
}
int myMin(int a,int b)
{
return (a>b?b:a);
}
Function myMaxFun={myMax};
Function myMinFun={myMin};
int main()
{
Function *func = &myMaxFun;//类似于C++指向不同的对象
printf("%d\n",func->myMaxMin(2,5)); //类似与C++调用对象的成员函数
func = &myMinFun;
printf("%d\n",func->myMaxMin(2,5));
system("pause");
return 0;
}