复习一下曾经的学习记录。讨论一下C语言如何面向对象,及和其它高级语言面向对象的区别。
众多高级语言都有OO的思想,属于OOP。
多年前大一上刚学习时,也不知道这些专业名词,什么是OO,什么是OOP。大一下学了C++,才了解面向对象,以为有class才是面向对象。后来的经过深入的学习才知道,C语言也可以做到面向对象,只不过没有那么完美罢了。
教材中称,C语言作为底层的面向过程的语言,不是面向对象的。实际上,内核源码中就有的思想,个人觉得就是可以把其作为对象使用,利用结构体和函数指针便能实现,不同于其它高级程序设计语言的OOP三大特性(继承、封装、多态),C语言实现的结构体作为对象来说,具有的是OOP中的两个特性(封装、多态),而不具备继承。
如果非要具有继承特性的话,可以考虑把父类成员作为子类结构体的一个变量(第一个变量,取决于编译器),毕竟C++就是这么干的。
一个简单的例子:
其中,定义了一个动物类。多态特性的简单实现可以利用结构体中的函数指针的再次赋值实现。
#include<stdio.h>
struct Animal{
char name[128];
int age;
int sex;
int dd;
void (*peat)();
void (*pbeat)();
};
// 3 eat
void dogEat(){
printf("dog eat si\n");
}
void catEat(){
printf("cat eat fish\n");
}
void personEat(){
printf("person eat rice\n");
}
// 3 hit
void dogBeat(){
printf("dog hit\n");
}
void catBeat(){
printf("cat hit\n");
}
void personBeat(){
printf("person hit\n");
}
int main()
{
//struct Animal dog;
struct Animal cat;
struct Animal person;
struct Animal dog={"wang!",1,1,1,dogEat,dogBeat};
// new method
struct Animal dog2 = {
.peat = dogEat,
.pbeat = dogBeat
};
dog.peat = dogEat;
cat.peat = catEat;
person.peat = personEat;
dog.peat();
dog2.peat();
cat.peat();
person.peat();
// printf("hello");
return 0;
}
结构体变量整体赋值的两种方式:
struct Animal dog={"wang!",1,1,1,dogEat,dogBeat};
// 按需赋值,内核中的方法
struct Animal dog2 = {
.peat = dogEat,
.pbeat = dogBeat
};