结构体封装性
结构体封装性就是说结构体内嵌函数指针。
函数指针就是指指向函数的指针变量,因此符合面向对象的封装性,即结构体内嵌一个函数指针(结构体成员有一个函数指针)。
当要给结构体内的函数指针赋值时(当然不是瞎赋值,而是某个函数的首地址),相当于该函数指针已经获取了赋值函数的入口地址。该函数指针也可以像使用函数一样调用它。
函数指针声明方法:
返回值类型 (*指针变量名)([形参列表]);
举个栗子
#include <stdio.h>
struct student
{
char name[20];
int age;
int id;
//函数指针
void (* introduce)(const char *name , int age ,int id);
};
//定义给结构体中函数指针赋值的函数
void say_tom(const char *name,int age,int id);
void say_dog(const char *name,int age,int id);
//初始化结构体
struct student Mery={
.name = "Mery",
.age = 19,
.id = 100,
.introduce = say_tom,
};
int main()
{
struct student Tom ={"Tom",18,99,say_dog};
Tom.instroduce(Tom.name,Tom.age,Tom.id);
Mery.introduce(Mery.name,Mery.age,Mery.id);
return 0;
}
void say_tom(const char *name,int age,int id)
{
printf("myname is %s ,i am a good boy age:%d myid is :%d\n",name,age,id);
}
void say_dog(const char *name,int age,int id)
{
printf("my name is %s i am a dog age : %d my id is : %d\n",name,age,id);
}
在这个案例中,我们定义一个student 结构体,其中包含student 的name,age,id还有一个介绍该学生的函数指针。
say_tom、say_dog方法需要介绍学生具体信息的函数,这两个函数就是分别吧这两位打印出来。
继承
说的我自己都模糊了,我简单概括一下吧,其实就是结构体嵌套。一个结构体套娃了另一个结构体,大套娃里面包含了小套娃的所有成员,(这么大白话,我奶奶在天上都听懂了)调用怎么用呢?大套娃.小套娃.小套娃成员。
举个栗子
struct father
{
struct son1;
…
}
struct son1{
char a;
short b;
int c;
…
}
…(other son)
那么main函数里面怎么给这些儿子赋值呢?father.son1.a=?;
就这样那么继承有什么好处呢?
在这种几百行的小程序看不出什么但是在实际的项目上有很多这种结构体就是这种很多结构体,结构上有的一样,有的可以用继承来节省大量代码行的重复,但是会不会节省内存空间呢?我来看看
这个不对,这个不算嵌套
这个才是,因为son嵌套没法直接打印出它的地址,我就把它的成员变量打出来,反正偏移量是0,也是嵌套结构体的地址。细品这两个程序。
多态
面向对象的多态:使用一个类,该类具有对应的属性和方法,这套属性和方法遇到不同的数据输出也有不同。
结构体void*万能指针
别多想,还是嵌套。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
//人 类
struct human
{
int id;
char *name;
void *humandata;
void (*handler_humandata)(int id,char *name,struct human human_st);
};
//way 1
void print_data(int id,char *name,struct human human_st)
{
printf("id: %d name is %s,he is a %s \n",id,name,human_st.humandata);
}
//way2
void print_data1(int id,char *name,struct human human_st)
{
printf("id:%d name is %s ,he have %d money!\n",id,name,human_st.humandata);
}
int main()
{
struct human xiaoming;
xiaoming.id =1010;
xiaoming.name="xiaoming";
xiaoming.humandata="student";
xiaoming.handler_humandata=print_data;
xiaoming.handler_humandata(xiaoming.id,xiaoming.name,xiaoming);
struct human AA;
AA.id =3366;
AA.name="AA";
AA.humandata=(void*)10000;
AA.handler_humandata=print_data1;
AA.handler_humandata(AA.id,AA.name,AA);
return 0;
}
xiaoming.humandata=(void * ) “student”;
AA.humandata=(void* )10000;这个就是多态
AA.handler_humandata=print_data1;
AA.handler_humandata(AA.id,AA.name,AA);
这个叫封装。函数指针替代函数。
参考《嵌入式C语言实战开发》
结语:实际运用中这三个可能会组合使用的,开始实操时还是会有点生涩。