上篇博文中通过参数的多样化来实现函数多态特性,然而存在一种实际的场景是参数个数和类型一致的函数,
但是运行过程不同,例如+、-、*、/ 等基本的四则远算,其都是二元远算,且参数类型基本一致,此时该如何多态呢。
我觉得还是有点意思的。多态的目的是减少重复定义,选择最合适的类型自动匹配执行对应函数。
(还有一种是父类对象引用子类实例,但C中没有继承的概念,所以这个不再解释)
说的这么悬乎,我觉得可以使用隐藏函数名的方式来达到预期的效果(仅是一种思路)。
实例如下:
#include <stdio.h>
typedef int func_t(int,int);
int add(int a, int b){return a+b;};
int sub(int a, int b){return a-b;};
int mul(int a, int b){return a*b;};
int div(int a, int b){return a/b;};
void print(int *arr, int len){
int i;
for(i=0;i<len;i++) printf("%d\t",arr[i]);
putchar('\n');
}
int main(void){
void (*func_p1)(int *,int len);
int (*func_p2[4])(int,int) = {add,sub,mul,div};
func_t *func_p3[4] = {add,sub,mul,div}; // equals with func_p2
int array[]={1,22,3,44,5,66};
func_p1 = print;
func_p1(array,sizeof(array)/sizeof(int)); // in order to test func point
printf("%d\t%d\t%d\t%d\n",func_p2[0](2,1),func_p2[1](2,1),func_p2[2](2,1),func_p2[3](2,1));
printf("%d\t%d\t%d\t%d\n",func_p3[0](2,1),func_p3[1](2,1),func_p3[2](2,1),func_p3[3](2,1));
return 0;
}
gcc编译
$ gcc -o calc calc.c
$ ./calc
1 22 3 44 5 66 --测试函数指针的使用
3 1 2 2 --使用func_p2指针函数实现2+1 | 2-1 | 2*1 | 2/1
3 1 2 2 --使用func_p3函数指针数组实现2+1 | 2-1 | 2*1 | 2/1
小结:
对于另类的多态 -- 参数相同(个数和类型)采用隐藏函数名的思路实现。
期待您不吝赐教!