Chinaunix首页 | 论坛 | 博客
  • 博客访问: 357515
  • 博文数量: 127
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 333
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-27 14:44
个人简介

兴趣是最好的学习契机!

文章分类

全部博文(127)

文章存档

2017年(1)

2016年(3)

2015年(54)

2014年(58)

2013年(11)

我的朋友

分类: C/C++

2014-06-19 13:40:46

  众所周知,C语言十分的强大,可以实现几乎所有的功能.可惜的是,它终究只是30多年前的产物,面向过程编程现在已经逐渐被面向对象编程所取代了.

然而,你又是否知道,Windows2000是用7500W行C语言编写出来的.如果单单是面向过程,估计这样编写出来的OS会混乱不堪.

其实,你知道C语言很强大,但是你可能不知道它强大到能够实现面向对象编程的.现在就由我来介绍一下具体的实现方法吧...

C语言没有class这样的关键字,只有struct.但是struct只能保存数据成员,不能保存方法.可是,C语言的精髓就在于指针,在struct中加入相应方法的函数指针就可以完全实现了类的功能了.只要在创建实例,初始化时把相应的函数指针赋值就行了.

有了类还不能实现面向对象.我们还需要继承呀.那么怎样继承呢?也很简单,直接把父类作为子类的第一个数据元素就搞掂了.

继承搞掂了,还是不行的.我们还需要封装好每一个类.实现封装的方法就是使用static和extern这两个关键字就行了.详细的理由,自己看回一下C语言的课本有关生命周期的介绍那部分就可以知道了.

就这样,我们就用C语言实现了面向对象的编程了.

介简:

       Redy的开发语言是C,但在源码中,有很多地方都使用到了面向对象编程的方法,例如:在基本数据类型这一个模块,所有的数据类型都继承robject;在抽象语法树模块,所有的节点都继承astobjct。在linux内核中,也有很多是使用的面向对象方法,在虚拟文件系统,驱动模型中都可以看到。c语言是一种结构化编程语言,以模块工能和处理过程设计为主,实现数据与代码分隔化。面向对象方法论中,核心是类,类是用于创造对象的模板,其三要素为:封装,继承,多态。C语言本身对面向对象的支持很弱,但可以通过一些技巧来实现。下面通过一个具体的实例来说明实现这此技巧。

实例介简:

       在几何中,所有的几何类型都继承父类“形状(shape)”,父类“形状”有两处属性s_type和s_name。其中s_type用于表示该形状所属的类型,s_name用于表于该形状态的名称。而且父类shape还有两个虚接口,一个为shape_area用于返回该形状的面积,一个为shape_perimeter用于返回该形状的周长。所子继承“形状”的子类都必须实现这两个接口。
  1. struct shape;
  2. struct shape_ops
  3. {
  4.     
  5.     float (*so_area)(struct shape*); 
  6.     
  7.     int (*so_perimeter)(struct shape*);
  8. };
  9. struct shape
  10. {
  11.     int* s_type;
  12.     char* s_name;
  13.     struct shape_ops* s_ops; 
  14. };

  15. float shape_area(struct shape* s)  
  16. {
  17.     return s->s_ops->so_area(s);  
  18. }
  19. int shape_perimeter(struct shape* s)
  20. {
  21.     return s->s_ops->so_perimeter(s);
  22. }
        几何体“三角形(triangle)”继承父类“形状”,并且实现了父类的两个虚接口。“三角形”有三条边,分别用t_side_a,t_side_b,t_side_c来表于三条边的长度。
  1. struct triangle
  2. {
  3.     struct shape t_base;
  4.     int t_side_a;
  5.     int t_side_b;
  6.     int t_side_c;
  7. };

  8. float triangle_area(struct shape* s)  
  9. {
  10.     struct triangle* t=(struct triangle*)s;
  11.     int a=t->t_side_a;
  12.     int b=t->t_side_b;
  13.     int c=t->t_side_c;
  14.     float p=(a+b+c)/2;
  15.     return sqrt(p*(p-a)*(p-b)*(p-c));
  16. }
  17. int triangle_perimeter(struct shape* s)  
  18. {
  19.     struct triangle* t=(struct triangle*)s;
  20.     int a=t->t_side_a;
  21.     int b=t->t_side_b;
  22.     int c=t->t_side_c;
  23.     return a+b+c;
  24. }
  25. struct shape_ops triangle_ops=    
  26. {
  27.     triangle_area,
  28.     triangle_perimeter,
  29. };
  30. struct triangle* triangle_create(int a,int b,int c)  
  31. {
  32.     struct triangle* ret=(struct triangle*)malloc(sizeof (*ret));
  33.     ret->t_base.s_name="triangle";
  34.     ret->t_base.s_ops=&triangle_ops;
  35.     ret->t_side_a=a;
  36.     ret->t_side_b=b;
  37.     ret->t_side_c=c;
  38.     return ret;
  39. }
        几何体“矩形(rectangle)”继承父类“形状”,同样也实现的父类的两个虚接口。有两个属性r_width和r_height,分别表示矩形的长和宽。
  1. struct rectangle
  2. {
  3.     struct shape r_base;
  4.     int r_width;
  5.     int r_height;
  6. };

  7. float rectangle_area(struct shape* s)  
  8. {
  9.     struct rectangle* r=(struct rectangle*)s;
  10.     return r->r_width*r->r_height;
  11. }
  12. int rectangle_perimeter(struct shape* s)
  13. {
  14.     struct rectangle* r=(struct rectangle*)s;
  15.     return (r->r_width+r->r_height)*2;
  16. }
  17. struct shape_ops rectangle_ops=      
  18. {
  19.     rectangle_area,
  20.     rectangle_perimeter,
  21. };

  22. struct rectangle* rectangle_create(int width, int height)  
  23. {
  24.     struct rectangle* ret=(struct rectangle*)malloc(sizeof(*ret));
  25.     ret->r_base.s_name="rectangle";
  26.     ret->r_base.s_ops=&rectangle_ops;
  27.     ret->r_height=height;
  28.     ret->r_width=width;
  29.     return ret;
  30. }
测试代码:
  1. int main()
  2. {
  3.     struct shape* s[4];
  4.     s[0]=triangle_create(5,5,4);
  5.     s[1]=triangle_create(3,4,5);
  6.     s[2]=rectangle_create(10,12);
  7.     s[3]=rectangle_create(5,8);

  8.     int i=0;
  9.     for(i=0;i<4;i++)
  10.     {
  11.         float area=shape_area(s[i]);    
  12.         int perimeter=shape_perimeter(s[i]);
  13.         char* name=s[i]->s_name;

  14.         printf("name:%s ,area:%.2f ,perimeter:%d\n",name,area,perimeter);
  15.     }
  16.     return 0;
  17. }

运行结果:
  1. name:triangle ,area:9.17 ,perimeter:14
  2. name:triangle ,area:6.00 ,perimeter:12
  3. name:rectangle ,area:120.00 ,perimeter:44
  4. name:rectangle ,area:40.00 ,perimeter:26
阅读(597) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~