C++有三个最重要的特点,即继承、封装、多态。我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性。
(1)继承性
1. typedef struct _parent
2. {
3. int data_parent;
4.
5. }Parent;
6.
7. typedef struct _Child
8. {
9. struct _parent parent;
10. int data_child;
11.
12.}Child;
在设计C语言继承性的时候,我们需要做的就是把基础数据放在继承的结构的首位置即可。这样,不管是数据的访问、数据的强转、数据的访问都不会有什么问题。
(2)封装性
1. struct _Data;
2.
3. typedef void (*process)(struct _Data* pData);
4.
5. typedef struct _Data
6. {
7. int value;
8. process pProcess;
9.
10.}Data;
封装性的意义在于,函数和数据是绑在一起的,数据和数据是绑在一起的。这样,我们就可以通过简单的一个结构指针访问到所有的数据,遍历所有的函数。封装性,这是类拥有的属性,当然也是数据结构体拥有的属性。
(3)多态
1. typedef struct _Play
2. {
3. void* pData;
4. void (*start_play)(struct _Play* pPlay);
5. }Play;
多态,就是说用同一的接口代码处理不同的数据。比如说,这里的Play结构就是一个通用的数据结构,我们也不清楚pData是什么数据,start_play是什么处理函数?但是,我们处理的时候只要调用pPlay->start_play(pPlay)就可以了。剩下来的事情我们不需要管,因为不同的接口会有不同的函数去处理,我们只要学会调用就可以了。
#include<stdio.h> #include<stdlib.h> struct cmd { char *p; void(*prun)(struct cmd *pcmd); void(*pprint)(struct cmd *pcmd); }; typedef struct cmd CMD; void run(CMD *pcmd ) { system(pcmd->p); } void print(CMD *pcmd) { printf("%s", pcmd->p); } struct newcmd { struct cmd cmd1; int(*plength)(struct newcmd *pnewcmd); }; int getlength(struct newcmd *pnewcmd) { return strlen(pnewcmd->cmd1.p);//返回长度 } void main() { struct newcmd newcmd1; newcmd1.cmd1.p = "notepad"; newcmd1.cmd1.pprint = print; newcmd1.cmd1.prun = run; newcmd1.plength = getlength;//初始化 newcmd1.cmd1.pprint(&newcmd1.cmd1); newcmd1.cmd1.prun(&newcmd1.cmd1); printf("%d",newcmd1.plength(&newcmd1)); system("pause"); } void main1() { CMD cmd1 = { "notepad", run, print }; cmd1.pprint(&cmd1); cmd1.prun(&cmd1); system("pause"); }
#include<stdio.h> #include<stdlib.h> struct ren { void(*pj)(struct ren *p); }; struct nanren { struct ren ren1; void(*pj)(struct nanren *p); }; void nanrenya(struct nanren *pnan) { printf("男人的虎牙"); } struct nvren { struct ren ren1; void(*pj)(struct nvren *p); }; void nvrenya(struct nvren *pnv) { printf("女人的baiya "); } void gettooth(struct ren *pren) { printf("gogogogo"); } void main() { struct nanren tansheng1; tansheng1.ren1.pj = gettooth; tansheng1.ren1.pj(&tansheng1.ren1); tansheng1.pj = nanrenya; tansheng1.pj(&tansheng1); struct nvren ftansheng1; ftansheng1.ren1.pj = gettooth; ftansheng1.ren1.pj(&ftansheng1.ren1); ftansheng1.pj = nvrenya; ftansheng1.pj(&ftansheng1); getchar(); }