zoukankan      html  css  js  c++  java
  • 纯C实现面向对象

    #include <stdio.h>
    #include <stdlib.h>
    
    //接口
    #ifndef Interface
    #define Interface struct
    #endif
    
    //
    #ifndef Class
    #define Class struct
    #endif
    
    //抽象形状类
    Class Shape;
    typedef Class Shape shape;
    //抽象形状类的方法声明
    shape* Shape(int edges);
    int shape_getEdges(shape *);
    int shape_getArea(void);
    void _Shape(shape *);
    
    //三角形类
    Class Triangle;
    typedef Class Triangle triangle;
    //三角形类的方法声明
    triangle * Triangle(int bottom, int height);
    int triangle_getEdges(triangle *);
    int triangle_getArea(triangle *);
    void _Triangle(triangle *);
    
    //矩形类
    Class Rectangle;
    typedef Class Rectangle rectangle;
    //矩形类的方法声明
    rectangle * Rectangle(int bottom, int height);
    int rectangle_getEdges(rectangle *);
    int rectangle_getArea(rectangle *);
    void _Rectangle(rectangle *);
    
    //抽象形状类实现
    Class Shape
    {
        int edges;
        int (*getEdges)(shape*);
        int (*getArea)(void);
    };
    
    //形状类构造函数
    shape* Shape(int edges)
    {
        shape * obj = (shape *) malloc(sizeof(shape));
        obj->edges = edges;
        obj->getEdges = shape_getEdges;
        obj->getArea = shape_getArea;
        return obj;
    }
    
    int shape_getEdges(shape* obj)
    {
        return obj->edges;
    }
    
    int shape_getArea(void)
    {
        return -1;
    }
    
    //形状类析构函数
    void _Shape(shape * obj)
    {
        if(obj == NULL)
            return; 
        free(obj); 
    }
    
    //三角形类实现
    Class Triangle
    {
        shape * super;
        int bottom;
        int height;
        int (*getEdges)(triangle *);
        int (*getArea)(triangle *);
    };
    
    //三角形类构造函数
    triangle * Triangle(int bottom, int height)
    {
        triangle* obj = (triangle*) malloc(sizeof(triangle));
        //调用Shape构造函数用于实现继承
        obj->super = Shape(3);
        obj->bottom = bottom;
        obj->height = height;
        obj->getEdges = triangle_getEdges;
        obj->getArea = triangle_getArea;
        return obj;
    }
    
    int triangle_getEdges(triangle * obj)
    {
        return obj->super->edges;
    }
    
    int triangle_getArea(triangle * obj)
    {
        return (obj->bottom * obj->height) / 2;
    }
    
    //三角形类析构函数
    void _Triangle(triangle * triangle)
    {
        _Shape(triangle->super); 
    
        if(triangle == NULL)
        {
            return; 
        }
    
        free(triangle); 
    }
    
    //矩形类实现
    Class Rectangle
    {
        shape * super;
        int bottom;
        int height;
        int (*getEdges)(rectangle *);
        int (*getArea)(rectangle *);
    };
    
    //矩形类构造函数
    rectangle * Rectangle(int bottom, int height)
    {
        rectangle * obj = (rectangle *)malloc(sizeof(rectangle));
        //调用Shape构造函数用于实现继承
        obj->super = Shape(4);
        obj->bottom = bottom;
        obj->height = height;
        obj->getEdges = rectangle_getEdges;
        obj->getArea = rectangle_getArea;
        return obj;
    }
    
    int rectangle_getEdges(rectangle * obj)
    {
        return obj->super->edges;
    }
    
    int rectangle_getArea(rectangle * obj)
    {
        return (obj->bottom * obj->height);
    }
    
    //矩形类析构函数
    void _Rectangle(rectangle * obj)
    {
        _Shape(obj->super);
        if(obj == NULL)
        {
            return;
        }
        free(obj);
    }
    
    //测试
    void main(){
        shape* shapeObj = Shape(0);
         printf("%d
    ", shapeObj->getEdges(shapeObj));
        printf("%d
    ", shapeObj->getArea());
        _Shape(shapeObj);
    
        triangle* triangleObj = Triangle(4, 5);
        printf("%d
    ", triangleObj->getEdges(triangleObj));
        printf("%d
    ", triangleObj->getArea(triangleObj));
        _Triangle(triangleObj);
    
        rectangle* rectangleObj = Rectangle(4, 5);
        printf("%d
    ", rectangleObj->getEdges(rectangleObj));
        printf("%d
    ", rectangleObj->getArea(rectangleObj));
        _Rectangle(rectangleObj);
    }
  • 相关阅读:
    第五节、矩阵分解之LU分解
    第四节、逆矩阵与转置矩阵
    第三节、矩阵乘法
    第二节、矩阵消元(高斯消元)
    重学线代——声明篇
    第一节、方程组的几何解释
    String类
    Mycat的安装及配置
    使用InfluxDB、cAdvisor、Grafana监控服务器性能
    Rancher的使用
  • 原文地址:https://www.cnblogs.com/zfc2201/p/3500200.html
Copyright © 2011-2022 走看看