[C语言]利用函数指针实现C++多态

一. 函数指针,指针函数是什么

1. 指针函数

  指针函数,首先它是一个函数,并且它的返回值是一个指针。形如:

// 返回值为整型指针类型
int* fun2()
{
	int* p = (int*)malloc(sizeof(int));

	return p;
}

2. 函数指针

  它是指针,指向函数的指针,形如:

// 函数名代表了函数的入口地址
int fun(int a)
{
	printf("fun()被调用");
}

void main()
{
	// 从结合律看 第一个()代表了它是一个指针,第二个()代表了它指向函数
	// 所以pF是一个指向返回值为整型,参数列表中含有一个整型参数的函数
	int(*pF)(int a);
	pF = fun;  // 函数名代表了函数的入口地址
	pF(1); // 通过函数指针调用函数
}

还可通过typedef对类型进行重定义,方法如下:
1). 先定义函数类型,根据类型定义指针变量

// 先定义函数类型,根据类型定义指针变量
	// 有typedef是类型,没有是变量
	typedef int FUN(int a);		// FUN函数类型
	FUN* p1 = NULL;	 // 函数指针变量(只能指向函数返回值为int类型,并且传入参数为一个参数的int类型的函数)
	//p1 = &fun;
	p1 = fun;   // p1指向fun函数
	fun(5);	// 传统调用方法
	p1(6);  // 函数指针变量调用方法

2). 先定义函数指针类型,根据类型定义变量(常用)

	typedef int (*PFUN)(int a);	 // PFUN,函数指针类型
	PFUN p2 = fun; // p2 指向 fun
	p2(7);

二. 函数指针的应用

1. 利用数组存放函数指针

此处不展示加减乘除函数的原理,仅对主函数中的思想进行展示。

如果利用普通格式对这些函数调用,则要利用到选择结构进行判断,此处提供另外一种思考方式。

// 同类型函数通过指针数组进行调用
int main()
{
	// 函数指针数组
	void (*fun[5])() = { add, minus, multi, divide, myeixt };
	// 指针数组 存放函数名
	char* buf[] = {"add", "min", "mul", "div", "exit"};

	char cmd[100];
	int i = 0;
	while (1)
	{
		printf("请输入指令:");
		scanf("%s", cmd);

		for (i = 0; i < 5; i++)
		{
			// 与指针数组中的字符串进行对比
			if (strcmp(cmd, buf[i]) == 0)
			{
				fun[i](); // 通过数组访问对应函数
				break;  // 跳出for
			}
		}
	}

	return 0;
}

2. 利用函数指针实现多态

我们通过在函数中的参数列表传入函数指针,通过传入的函数指针回调其他函数。来实现多态

#include <stdio.h>
#include <string.h>

int add(int a, int b)
{
	return a + b;
}

int minus(int a, int b)
{
	return a - b;
}

// 函数的参数是变量, 可以是函数指针变量吗?
// 多态,多种形态,调用同一接口,不一样的表现
void fun(int x, int y, int(*p)(int a, int b)/*函数指针,通过函数名传入函数入口地址,表示调用哪个函数*/)
{
	printf("fun1111111\n");

	int a = p(x, y); // 回调函数 add(1, 2) minus(10, 5);
	printf("a = %d\n", a);
}

// 第二种定义形式
typedef int(*Q)(int a, int b);  // 函数指针类型
void fun1(int x, int y, Q p)
{
	printf("fun1111111\n");

	int a = p(x, y); // 回调函数 add(1, 2) minus(10, 5);
	printf("a = %d\n", a);
}

int main()
{
	fun(1, 2, add);

	fun(10, 5, minus);

	fun1(2, 1, minus);

	return 0;
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值