C语言中的多态

  • Post category:C

C语言中的多态

多态是面向对象编程中重要的一个概念,它使得子类能够以自己的方式实现继承自父类的方法。在C语言中,虽然没有类的概念,但我们可以通过指针和函数指针等机制来实现多态。

函数指针实现多态

在C语言中,我们可以定义一个函数指针,然后将函数指针作为参数传递,这就可以实现多态。下面是一个例子:

#include <stdio.h>

void foo1()
{
    printf("Calling foo1()\n");
}

void foo2()
{
    printf("Calling foo2()\n");
}

void CallFoo(void (*foo)())
{
    (*foo)();
}

int main()
{
    CallFoo(foo1);
    CallFoo(foo2);
    return 0;
}

运行结果为:

Calling foo1()
Calling foo2()

在上面的例子中,我们定义了两个函数foo1和foo2,然后定义了一个函数指针参数CallFoo,它的类型是void (*)(void),表示接受一个无返回值无参数的函数指针。最后在主函数中调用CallFoo,并分别传递foo1和foo2。

结构体与函数指针实现多态

在C语言中,结构体内可以包含函数指针,我们可以通过定义不同的结构体,包含不同的函数指针,来实现多态。下面是一个例子:

#include <stdio.h>

struct Animal {
    char *name;
    void (*speak)();
};

void dog_speak()
{
    printf("I'm a dog!\n");
}

void cat_speak()
{
    printf("I'm a cat!\n");
}

int main()
{
    struct Animal dog = { "dog", dog_speak };
    struct Animal cat = { "cat", cat_speak };

    dog.speak();
    cat.speak();
    return 0;
}

运行结果为:

I'm a dog!
I'm a cat!

在上面的例子中,我们定义了一个结构体Animal,它包含一个字符串类型的成员name和一个函数指针类型的成员speak。然后我们定义两个不同的Animal结构体变量dog和cat,并分别赋值不同的name和speak。最后在主函数中调用dog和cat结构体变量的speak函数指针,即可实现多态。

以上就是C语言中实现多态的两种方法,通过函数指针可以将调用函数的具体实现与调用函数的代码分离开来,增加代码的灵活性。同时,使用结构体和函数指针可以更好地模拟面向对象编程的概念。