c语言模拟java面向对象_纯c语言实现面向对象分析与示例分享

#include

#include

//接口

#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\n", shapeObj->getEdges(shapeObj));

printf("%d\n", shapeObj->getArea());

_Shape(shapeObj);

triangle* triangleObj = Triangle(4, 5);

printf("%d\n", triangleObj->getEdges(triangleObj));

printf("%d\n", triangleObj->getArea(triangleObj));

_Triangle(triangleObj);

rectangle* rectangleObj = Rectangle(4, 5);

printf("%d\n", rectangleObj->getEdges(rectangleObj));

printf("%d\n", rectangleObj->getArea(rectangleObj));

_Rectangle(rectangleObj);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode152. 乘积最大子数组

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 代码 class Solution {publi…

成功试验基于C#/.NET的Android开发

今天最开心事情莫过于摸索验证了一个事情,C#也能进行Android和IOS开发,白天安装了开发环境,晚上进行测试,直到此时此刻,已经成功的导出一款基于C#/.NET的安卓APK,并且能够成功的导入到安卓手机运行&#xf…

使用机器学习预测天气_如何使用机器学习根据文章标题预测喜欢和分享

使用机器学习预测天气by Flavio H. FreitasFlavio H.Freitas着 如何使用机器学习根据文章标题预测喜欢和分享 (How to predict likes and shares based on your article’s title using Machine Learning) Choosing a good title for an article is an important step in the …

深入理解了MySQL,你才能说熟悉数据库

先抛出几个问题 1.为什么不建议使用订单号作为主键?2.为什么要在需要排序的字段上加索引?3.for update 的记录不存在会导致锁住全表?4.redolog 和 binlog 有什么区别?5.MySQL 如何回滚一条 sql ?6.char(50) 和 varchar(50) 效果是一样的么?索引知识回顾 对于 MySQL 数据库…

ibatis mysql 自增_mybatis自增主键

简单介绍:在使用mybats插入数据是,有很多需要和id关联的其他数据,所以在插入一条信息时获取其主键信息是很常见的操作。一 mysql数据库的主键自增(int类型的主键)1 创建一个表,设置表的id(此id必须是int类型),设置为au…

DataGridView控件用法二:常用属性

通常会设置的DataGridView的属性如下: AllowUserToAddRows - False指示是否向用户显示用于添加行的选项,列标题下面的一行空行将消失。一般让其消失。AllowUserToDeleteRows - False指示是否允许用户从DataGridView删除行。一般不允许。AllowUserToOrder…

leetcode面试题 16.21. 交换和(二分查找)

给定两个整数数组,请交换一对数值(每个数组中取一个数值),使得两个数组所有元素的和相等。 返回一个数组,第一个元素是第一个数组中要交换的元素,第二个元素是第二个数组中要交换的元素。若有多个答案&…

谈谈IP和MAC捆绑的破解之道

来源:[url]http://l-y.vicp.net[/url]我们学校最近将MAC和IP进行了捆绑,又在服务器(2K)上进行了上网时间的限制,真是烦死人了,我想我可是一个从不受限制的人啊,怎么可以就这样束手就擒呢!古话说…

如何在JavaScript中区分深层副本和浅层副本

by Lukas Gisder-Dub卢卡斯吉斯杜比(LukasGisder-Dub) 如何在JavaScript中区分深层副本和浅层副本 (How to differentiate between deep and shallow copies in JavaScript) New is always better!新总是更好! You have most certainly dealt with copies in Java…

网站QQ全屏PHP代码,QQ技术导航升级版 超级导航美化版带后台版 PHP源码

QQ技术导航升级版 超级导航美化版带后台版改进F2样式,主针对QQ教程网、卡盟、博客、提供更好收录的位置。改进QQ技术导航背景,增加整体美观效果。去掉死链页面,站长操作使用更加有扩大空间。优化后台登陆界面,去掉织梦后台携带的广…

MySQL基础操作(一)

MySQL操作 一、创建数据库 # utf-8 CREATE DATABASE 数据库名称 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;# gbk CREATE DATABASE 数据库名称 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; 二、用户管理 创建用户create user 用户名IP地址 identified by 密码; 删…

集合框架05

一、HashSet集合 1 public class Demo01 {2 /*3 * Set接口,特点不重复元素,没索引4 * Set接口的实现类,HashSet(哈希表)5 * 特点:无序集合,存储和取出的顺序不同,没有索引,不…

leetcode1233. 删除子文件夹

你是一位系统管理员,手里有一份文件夹列表 folder,你的任务是要删除该列表中的所有 子文件夹,并以 任意顺序 返回剩下的文件夹。 我们这样定义「子文件夹」: 如果文件夹 folder[i] 位于另一个文件夹 folder[j] 下,那…

HIVE-分桶表的详解和创建实例

我们学习一下分桶表,其实分区和分桶这两个概念对于初学者来说是比较难理解的。但对于理解了的人来说,发现又是如此简单。 我们先建立一个分桶表,并尝试直接上传一个数据 create table student4(sno int,sname string,sex string,sage int, sd…

51nod1270(dp)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId1270 题意:中文题诶~ 思路:dp sabs(a1-a0)abs(a2-a1).... 要使s尽量大,需要让abs(ai-ai-1)尽量大,那么可以让其中一个尽量小&…

Windows IIS 日志分析研究(Log Parser Log Parser Lizard Log Parser Studio) update...

Windows主要有以下三类日志记录系统事件:应用程序日志、系统日志和安全日志。 存放目录:X:\Windows\System32\winevt\Logs\ System.evtx 系统日志 Application.evtx 应用程序日志 Security.evtx 安全日志 审核策略与事件查看器 # 管理工具 → 本地安全…

ios php ide,最好的PHP IDE for Mac? (最好免费!)

这里是PHP的Mac IDE的下降NetBeans自由!此外,所有产品的最佳功能。包括内联数据库连接,代码完成,语法检查,颜色编码,分割视图等。下降:这是一个内存猪在Mac上。准备好允许一半的内存&#xff0c…

leetcode79. 24 点游戏

你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,,-,(,) 的运算得到 24。 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) * (7-1) 24 代码 class Solution {public boolean judgePoint24(int[] n…

Linux邮件系统整合windows 2008 R2 AD域认证更新

1. 安装只要执行install.sh即可。(安装包约40几M) 2.文档更新功能 (原v1.0文档链接:http://godoha.blog.51cto.com/108180/691376) 本文转自 godoha 51CTO博客,原文链接:http://blog.51cto.com/…

004:神秘的数组初始化_使容器神秘化101:面向初学者的深入研究容器技术

004:神秘的数组初始化by Will Wang王Will 介绍 (Introduction) Regardless of whether you are a student in school, a developer at some company, or a software enthusiast, chances are you heard of containers. You may have also heard that containers are lightweig…