c语言实现静态多态和动态多态
时间: 2023-09-26 07:12:25 浏览: 128
最全的C语言笔试面试题.doc
在 C 语言中,没有直接支持静态多态和动态多态的语法特性。不过,可以通过一些技巧来实现类似的效果。
1. 静态多态(静态分派):
静态多态是指在编译时根据函数参数的类型来确定要调用的函数版本。在 C 语言中,可以使用函数指针来实现类似的效果。可以定义一个函数指针类型,然后根据不同的参数类型给函数指针赋不同的函数地址。通过调用函数指针来实现不同的行为。
示例代码:
```c
#include <stdio.h>
typedef void (*func_ptr)(int); // 定义函数指针类型
void func1(int x)
{
printf("Calling func1: %d\n", x);
}
void func2(int x)
{
printf("Calling func2: %d\n", x);
}
int main()
{
func_ptr ptr;
ptr = func1; // 给函数指针赋值
ptr(10); // 调用函数指针,输出 "Calling func1: 10"
ptr = func2;
ptr(20); // 调用函数指针,输出 "Calling func2: 20"
return 0;
}
```
2. 动态多态(动态分派):
动态多态是指在运行时根据对象的实际类型来确定要调用的函数版本。在 C 语言中,可以使用结构体和函数指针组合来实现类似的效果。定义一个结构体,包含不同类型的对象和对应的函数指针。通过运行时判断对象的实际类型,然后调用相应的函数指针,实现不同的行为。
示例代码:
```c
#include <stdio.h>
typedef struct {
int type;
void (*func_ptr)(void*);
} Object;
void func1(void* obj)
{
printf("Calling func1\n");
}
void func2(void* obj)
{
printf("Calling func2\n");
}
void process(Object* obj)
{
if (obj->type == 1) {
obj->func_ptr(obj);
} else if (obj->type == 2) {
obj->func_ptr(obj);
}
}
int main()
{
Object obj1 = {1, func1};
Object obj2 = {2, func2};
process(&obj1); // 输出 "Calling func1"
process(&obj2); // 输出 "Calling func2"
return 0;
}
```
这样就可以通过函数指针的方式实现静态多态和动态多态的效果。需要注意的是,在 C 语言中没有自动的类型检查和转换,所以需要手动进行类型判断和转换。
阅读全文