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.pswp.cn/news/393258.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393258.shtml
英文地址,請注明出處:http://en.pswp.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…