用C实现多态(重载与虚函数)

来源:互联网 发布:淘宝首页设计模板 编辑:程序博客网 时间:2024/05/17 09:41

1、C语言中通过函数指针实现C++中函数重载

link:http://www.linuxidc.com/Linux/2012-07/66399.htm 
貌似qsort函数就是一个典型的实现函数重载的例子!!

我们都知道重载是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;

}

原创粉丝点击