C语言实现面向对象
2017-01-05 10:52
183 查看
无意间在复习C的时候想到了这个主题,于是翻了点资料实现了一下,纯练手。
首先一个小tips就是C中的类基本是靠结构体实现的,但是C中又没有成员函数这个概念,所以这里就用到函数指针,但这个函数的实体,还是在结构体外部实现的。我们会在初始化的时候,把这个函数赋给这个指针。
下面讲面向对象。
面向对象三大特性:抽象,继承,多态。
C语言本身设计的时候这三个特性是一个都木有的,但是C有一个看似平常但非常牛X的东西,就是define。因为它的本质就是直接把后面的内容复制粘贴到所在的代码块。所以抽象,继承和多态,我们都可以通过define来实现。另外,C还有一个万能指针void*,它可以指向任何其他类型的指针。
抽象,在示例中我们可以看到,我们可以把Java接口或者抽象类中的abstract方法,定义成一个模板,放在父类中,子类中直接加入该模板即可。
继承,刚才说了,子类中直接加入该模板就可以实现父类中必须要求实现的方法或成员,也就是实现了继承,类似java的super。super后面你就可以实现子类自己的代码逻辑了。
多态,C的结构体指针有一个特性,如果一个结构体B内部的成员声明时类型和顺序和A一样,即使B后面有比A更多的成员,依然可以把B的指针强转成A的指针,并可以正常执行A指针中所有的成员或方法,参考上面代码的59行。
做完善了可以封装一套面向对象的C库,实现自己的面向对象能力。
// // main.c // individual_test // // Created by Amuro on 2016/12/28. // Copyright © 2016年 Amuro. All rights reserved. // #include <stdio.h> #include <stdlib.h> /****************Object*******************/ #define ObjectField void(*onDelete)(void*) typedef struct Object { ObjectField; } Object; #define ObjCreate(TYPE) malloc(sizeof(TYPE)) #define ObjDelete(obj) {\ obj->onDelete(obj);\ free(obj);\ } void ObjOnDelete(void* obj) { printf("obj on delete\n"); } Object* ObjInit(Object* obj) { obj->onDelete = ObjOnDelete; return obj; } /*************People extends Object**************/ typedef struct People { ObjectField; int age; void(*sayHello)(); }People; void PeopleSayHello() { printf("hello\n"); } void PeopleOnDelete(void *p) { ObjOnDelete(p); printf("people on delete\n"); } People* PeopleInit(People *p, int age) { ObjInit((Object*)p); p->age = age; p->sayHello = PeopleSayHello; p->onDelete = PeopleOnDelete; return p; } int main(int argc, const char * argv[]) { People* p = PeopleInit(ObjCreate(People), 20); p->sayHello(); ObjDelete(p); return 0; }
首先一个小tips就是C中的类基本是靠结构体实现的,但是C中又没有成员函数这个概念,所以这里就用到函数指针,但这个函数的实体,还是在结构体外部实现的。我们会在初始化的时候,把这个函数赋给这个指针。
下面讲面向对象。
面向对象三大特性:抽象,继承,多态。
C语言本身设计的时候这三个特性是一个都木有的,但是C有一个看似平常但非常牛X的东西,就是define。因为它的本质就是直接把后面的内容复制粘贴到所在的代码块。所以抽象,继承和多态,我们都可以通过define来实现。另外,C还有一个万能指针void*,它可以指向任何其他类型的指针。
抽象,在示例中我们可以看到,我们可以把Java接口或者抽象类中的abstract方法,定义成一个模板,放在父类中,子类中直接加入该模板即可。
继承,刚才说了,子类中直接加入该模板就可以实现父类中必须要求实现的方法或成员,也就是实现了继承,类似java的super。super后面你就可以实现子类自己的代码逻辑了。
多态,C的结构体指针有一个特性,如果一个结构体B内部的成员声明时类型和顺序和A一样,即使B后面有比A更多的成员,依然可以把B的指针强转成A的指针,并可以正常执行A指针中所有的成员或方法,参考上面代码的59行。
做完善了可以封装一套面向对象的C库,实现自己的面向对象能力。
相关文章推荐
- C语言中的面向对象(2)-C语言的多态实现(转载)
- C语言面向对象的实现
- 用C语言实现面向对象的开发
- C语言面向对象的实现---继承性
- 在C语言中实现面向对象
- C语言中的面向对象-C语言的多态实现
- c语言实现面向对象OOC
- 深入浅出C语言(6)----C语言实现面向对象
- C语言实现面向对象之继承性
- C语言也可以“面向对象”—— C语言实现封装、继承和多态
- 俺使用的C语言面向对象范式(第四节:多态的实现 与 总结)
- C语言实现动态数组(以面向对象的编程风格)
- 【转】C语言实现C++面向对象的封装、继承、多态机制
- C语言面向对象的思想(实现继承和多态)
- C语言实现面向对象
- 非典型2D游戏引擎 Orx 源码阅读笔记(6) C语言实现的面向对象
- C语言实现面向对象的多态之----条件判断
- C语言面向对象的实现---封装性
- C语言实现面向对象
- 在C语言中实现面向对象