c语言实现面向对象编程

介简:


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


实例介简:


在几何中,所有的几何类型都继承父类“形状(shape)”,父类“形状”有两处属性s_type和s_name。其中s_type用于表示该形状所属的类型,s_name用于表于该形状态的名称。而且父类shape还有两个虚接口,一个为shape_area用于返回该形状的面积,一个为shape_perimeter用于返回该形状的周长。所子继承“形状”的子类都必须实现这两个接口。

struct shape;

struct shape_ops

{

    /*返回几何体的面积*/

    float (*so_area)(struct shape*); 

    /*返回几何体的周长*/

    int (*so_perimeter)(struct shape*);

};

struct shape

{

    int* s_type;

    char* s_name;

    struct shape_ops* s_ops; /*虚接口,所有子类必须实现*/

};


float shape_area(struct shape* s)  /*求形状面积*/

{

    return s->s_ops->so_area(s);  

}

int shape_perimeter(struct shape* s) /*求周长*/

{

    return s->s_ops->so_perimeter(s);

}

几何体“三角形(triangle)”继承父类“形状”,并且实现了父类的两个虚接口。“三角形”有三条边,分别用t_side_a,t_side_b,t_side_c来表于三条边的长度。

/*三角形*/

struct triangle

{

    struct shape t_base;

    int t_side_a;

    int t_side_b;

    int t_side_c;

};


float triangle_area(struct shape* s)  /*三角形面积,用海伦公式*/

{

    struct triangle* t=(struct triangle*)s;

    int a=t->t_side_a;

    int b=t->t_side_b;

    int c=t->t_side_c;

    float p=(a+b+c)/2;

    return sqrt(p*(p-a)*(p-b)*(p-c));

}

int triangle_perimeter(struct shape* s)  /*三角形周长*/

{

    struct triangle* t=(struct triangle*)s;

    int a=t->t_side_a;

    int b=t->t_side_b;

    int c=t->t_side_c;

    return a+b+c;

}

struct shape_ops triangle_ops=    /*对父类虚接口的实现*/

{

    triangle_area,

    triangle_perimeter,

};

struct triangle* triangle_create(int a,int b,int c)  /*创建三角形*/

{

    struct triangle* ret=(struct triangle*)malloc(sizeof (*ret));

    ret->t_base.s_name="triangle";

    ret->t_base.s_ops=&triangle_ops;

    ret->t_side_a=a;

    ret->t_side_b=b;

    ret->t_side_c=c;

    return ret;

}

几何体“矩形(rectangle)”继承父类“形状”,同样也实现的父类的两个虚接口。有两个属性r_width和r_height,分别表示矩形的长和宽。

/*矩形*/

struct rectangle

{

    struct shape r_base;

    int r_width;

    int r_height;

};


float rectangle_area(struct shape* s)  /*矩形面积*/

{

    struct rectangle* r=(struct rectangle*)s;

    return r->r_width*r->r_height;

}

int rectangle_perimeter(struct shape* s)/*矩形周长*/

{

    struct rectangle* r=(struct rectangle*)s;

    return (r->r_width+r->r_height)*2;

}

struct shape_ops rectangle_ops=      /*对父类虚接口的实现*/

{

    rectangle_area,

    rectangle_perimeter,

};


struct rectangle* rectangle_create(int width, int height)  /*创建矩形*/

{

    struct rectangle* ret=(struct rectangle*)malloc(sizeof(*ret));

    ret->r_base.s_name="rectangle";

    ret->r_base.s_ops=&rectangle_ops;

    ret->r_height=height;

    ret->r_width=width;

    return ret;

}

测试代码:

int main()

{

    struct shape* s[4];

    s[0]=triangle_create(5,5,4);

    s[1]=triangle_create(3,4,5);

    s[2]=rectangle_create(10,12);

    s[3]=rectangle_create(5,8);


    int i=0;

    for(i=0;i<4;i++)

    {

        float area=shape_area(s[i]);    

        int perimeter=shape_perimeter(s[i]);

        char* name=s[i]->s_name;


        printf("name:%s ,area:%.2f ,perimeter:%d\n",name,area,perimeter);

    }

    return 0;

}


运行结果:

name:triangle ,area:9.17 ,perimeter:14

name:triangle ,area:6.00 ,perimeter:12

name:rectangle ,area:120.00 ,perimeter:44

name:rectangle ,area:40.00 ,perimeter:26


转载于:https://my.oschina.net/u/2408078/blog/539835

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值