最近在学习Java面向对象编程,同时发现C语言中也有类似面向对象的编程思想,比较突出的就是函数指针数组。
例如Java中多个子类继承同一个父类,在子类中覆盖父类的方法,然后可也通过调用同一条遇见只是传入的对象不同来实现调用不同方法,源代码如下:
//抽象类Animal
public abstract interface Animal {
public void Sound();
}
//实体类Cat
public class Cat implements Animal {
public void Sound(){
System.out.println("小猫叫:喵喵喵...");
}
}
//实体类Dog
public class Dog implements Animal {
public void Sound() {
System.out.println("小狗叫:汪汪汪...");
}
}
//测试类AnimalContainer
public class AnimalContainer {
public static void main(String[] args) {
Animal cat = new Cat();
Animal dog = new Dog();
AnimalContainer animalContainer = new AnimalContainer();
animalContainer.animalSpeak(cat);
animalContainer.animalSpeak(dog);
}
void animalSpeak(Animal animal){
animal.Sound();
}
}
我现在用C语言函数指针数组的使用可以实现同样的功能,即同一函数通过参数不同调用不同函数,源代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum animal{DOG,CAT};
void Dog_speak();
void Cat_speak();
void (*Speak[])(void) = {Dog_speak,Cat_speak};<pre name="code" class="objc">
int main()
{
Speak[DOG]();
Speak[CAT]();
return 0;
}
void Dog_speak()
{
printf("wangwang");
}
void Cat_speak()
{
printf("miaomiao");
}
运行结果如下:
大家可能会说这代码不是也可以用switch语句直接代替啊。
其实我觉着用函数指针数组有她的好处,当决定添加新的函数时,急需把它加入到
enum animal{DOG,CAT,TIGER};
void (*Speak[])(void) = {Dog_speak,Cat_speak,Tiger_speak};
函数指针数组让代码容易管理,她们让代码更短,更容易扩展,可以提高C编程技巧