2019独角兽企业重金招聘Python工程师标准>>>

如摘要所说,C语言不支持OOP(面向对象的编程)。并这不意味着我们就不能对C进行面向对象的开发,只是过程要复杂许多。原来以C++的许多工作,在C语言中需我们手动去完成。

博主将与大家一起研究一下如下用C语言实现面象对象的编程。

面向对象的三大特性:封装、继承、多态

我们要达到的目的如下:

Animal是动物,有两个方法:Eat()吃,Breed()繁衍。

Bird与Mammal都是Animal,Mammal是哺乳动物。

Penguin是企鹅,企鹅是Bird,企鹅不会飞。

Swallow是燕子,是Bird,会飞。

Bat是蝙蝠,是Mammal,会飞。

Tiger是老虎,是Mammal,不会飞。

Plane是飞机,会飞。它不是动物。

从上面的类继承关系来看,由于Swallow, Bat, Plane会飞,所以它们都继承了IFly接口。

首先我们用C++的类来实现上面的关系:

class Animal {
public:virtual void Eat() = 0;virtual void Breed() = 0;
};class Bird : public Animal {
public:virtual void Breed() {cout << "蛋生" << endl;}
};class Mammal : public Animal {
public:virtual void Breed() {cout << "胎生" << endl;}
};class IFly {
public:virtual void Fly() = 0;
};class Penguin : public Bird {
public:virtual void Eat() {cout << "企鹅吃鱼" << endl;}
};class Swallow : public Bird , public IFly {
public:virtual void Eat() {cout << "燕子吃虫子" << endl;}virtual void Fly() {cout << "燕子飞呀飞" << endl;}
};class Bat : public Mammal, public IFly {
public:virtual void Eat() {cout << "蝙蝠吃飞虫" << endl;}virtual void Fly() {cout << "蝙蝠飞呀飞" << endl;}
};class Tiger : public Mammal {virtual void Eat() {cout << "老虎吃肉" << endl;}
};class Plane : public IFly {
public:virtual void Fly() {cout << "飞机飞过天空" << endl;}
};

用下面的main.cpp来测试它们的继承效果:

int main()
{Penguin *penguin = new Penguin;Swallow *swallow = new Swallow;Bat *bat = new Bat;Tiger *tiger = new Tiger;Plane *plane = new Plane;Animal* animals[4] = {penguin, swallow, bat, tiger};IFly* flies[3] = {swallow, bat, plane};for (int i = 0; i < 4; ++i) {animals[i]->Eat();animals[i]->Breed();}cout << "-------------" << endl;for (int i = 0; i < 3; ++i)flies[i]->Fly();delete penguin;delete swallow;delete bat;delete tiger;delete plane;return 0;
}

执行的效果是:

企鹅吃鱼
蛋生
燕子吃虫子
蛋生
蝙蝠吃飞虫
胎生
老虎吃肉
胎生
-------------
燕子飞呀飞
蝙蝠飞呀飞
飞机飞过天空

上面演示的就是C++的多态功能。


多态这个特性给我们软件灵活性带来了很大的便利。由于某此限制,如硬件资源不够充裕、开发环境不支持C++等原理,我们不能使用C++。

那么我们下面要讨论的是用C来重新实现上面的多态功能。

main.c大致是这样子的:

int main()
{Object* penguin = Penguin_New();Object* swallow = Swallow_New();Object* bat = Bat_New();Object* tiger = Tiger_New();Object* plane = Plane_New();Object* animal[4] = {penguin, swallow, bat, tiger};IFly* flies[3] = {NULL};flies[0] = Swallow_AsIFly(swallow);flies[1] = Bat_AsIFly(bat);flies[2] = Plane_AsIFly(plane);for (int i = 0; i < 4; ++i) {Animal_Eat(animal[i]);Animal_Breed(animal[i]);}for (int i = 0; i < 4; ++i) {IFly_Fly(flies[i]);}Penguin_Delete(penguin);Swallow_Delete(swallow);Bat_Delete(bat);Tiger_Delete(tiger);Plane_Delete(plane);return 0;
}

上面编译时需要加 "-std=c99" 才能通过编译。


博主已实现了上面的Demo,代码已提交到:http://git.oschina.net/hevake_lcj/C_OOP_DEMO

该Demo实现了OOP的类继承、多态的特性。继承只支持单继承,还没有实现接口功能。

每个对象由三部分组成:info, data, func

  • info,类信息,存储该对象的:类型ID、虚函数表地址

  • data,对象的数据

  • func,虚函数指针

如下为 info 的定义:

typedef struct {uint32_t tag;   //! 高16位为TAG,低16位为class_idvoid* vfun;     //! 虚函数结构体地址
} class_info_t;

例如 Animal 类的定义,见 animal_def.h :

typedef struct {int health;
} Animal_Data;typedef struct {void (*Eat)();void (*Breed)();
} Animal_Func;typedef struct {class_info_t info;Animal_Data data;Animal_Func func;
} Animal;

结构图:

<明天再写>

即将讨论话题:

- 如何表述类的继承关系?

- 为什么要将data与func分开?

博主自己测试了一下,结果是:

$ ./c_oop_demo
start
企鹅吃鱼
蛋生
燕子吃虫子
蛋生
蝙蝠吃飞虫
胎生
老虎要吃肉
胎生
end

从上看来,已达到了预期的多态效果。

C++与C的比较

居说C++编译出来的可执行文件远多于C。于是博主对比了一下c_oop_demo与C++编译的同功能的可执行文件cpp_demo。博主惊讶地发现 c_oop_demo 的文件大小既还比 cpp_demo大一点。况且上面的 c_oop_demo 还没有实现接口功能呢,要是实现了,那不更大?这不由令博主对用C实现OOP,以为可以节省空间的想法大为失望。

看来,在实现同样的oop功能下,C++编译出的输出文件比自己手把手写的c_oop_demo要小,说明C++在这方便做了不少的优化。相比之下,C++用50多行的代码实现的功能,用C(博主亲自统计的)居然要写近1000行代码。代码的可维护性远不及C++。说C++生成的文件庞大,真是冤枉了C++。用C完成同等功还不如C++干得漂亮。

转载于:https://my.oschina.net/hevakelcj/blog/551474

用C实现OOP面向对象编程(1)相关推荐

  1. Java基础-OOP 面向对象编程

    OOP 面向对象编程 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构.强调的是具有某些特定功能的对象. 面向过程编程(Proced ...

  2. iOS 开发之 OOA (面向对象分析) OOD (面向对象设计) OOP (面向对象编程)

    OOA OOA 基本概念 OOA 全称 Object-Oriented Analysis 面向对象分析 指的是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA 与结构 ...

  3. 什么是OOP(面向对象编程)?

    我们来思考一个简单的问题:如何使用Python程序表示一只小狗呢?没错,表示一只小狗,或者说用Python程序对小狗进行建模,如果你回答不上来,那么请跟着我来看一下如何解决这个问题.下面是一只小狗的照 ...

  4. java oop_Java实现OOP(面向对象编程)

    一.对象的综述 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显 ...

  5. Java的OOP(面向对象编程)总结,有这一篇足矣

    前言:OOP是Java语言中重要组成部分,其中面向对象编程是Java中核心编程思想,今天就将OOP知识进行总结 目录 一.思维导图 二.面对对象 1.首先要了解面对对象是什么? 2.具体说法 3.面对 ...

  6. java OOP面向对象编程—2

    目录 第一节:static关键字 1.1 static 变量 1.2 静态方法 1.3 static 代码块 1.4 static 的优点和缺点 第二节: package和import 2.1 pac ...

  7. (转)OOP(面向对象编程)的几大原则

    文章转载自:http://blog.csdn.net/anders_zhuo/article/details/8949566 设计模式遵循的一般原则: 1.开-闭原则(Open-Closed Prin ...

  8. OOP面向对象编程(一)-------方法的重载

    面向对象之重载:* 方法的重载(overload)* 1.方法在同一个类中* 2.方法名需要相同* 3.方法的参数列表不同----参数个数不同/参数个数相同,但是参数类型不同* 补充:方法的重载与方法 ...

  9. OOP 面向对象编程

    面向对象 对象的概念是面向对象技术的核心.在现实世界里,我们面对的所有事物都是对象,如计算机.电视机.自行车等.在面向对象的程序设计中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界 ...

  10. javascript OOP 面向对象编程

    Pseudo-class declaration 原文地址:http://javascript.info/tutorial/pseudo-classical-pattern#pseudo-class- ...

最新文章

  1. java cms 垃圾回收_Java 9 或将放弃 CMS(并发标记清除垃圾收集器)
  2. 【转载】Linux下安装、配置、启动Apache
  3. The JVM Architecture Explained-JVM架构解析(译)
  4. 【国内首家】第一个基于语音生成实时知识图谱的系统来啦!!!
  5. 华为亮度自动调节没了_一加8T不止有8192级自动亮度调节 刘作虎在线种草
  6. 永恒之蓝漏洞原理 445_新代码漏洞“永恒之黑”该如何警惕?
  7. jquery手写轮播图_jquery 实现轮播图详解及实例代码_jquery_脚本之家
  8. python之字符编码(四)
  9. 无刷电机反电动势过零检测
  10. Codeforces Round #466 (Div. 2): E. Cashback(单调队列+DP)
  11. 到底该如何理解 Unix/Linux 的文件系统?看这篇就知道了
  12. 【Java愚公】gitlab关闭注册功能
  13. 企业支付宝转账到银行卡开发导引
  14. 第12届蓝桥杯国赛真题剖析-2021年5月29日Scratch编程初中级组
  15. matplotlib 的 spines模块详解
  16. Nano上CSI摄像头及人脸检测
  17. 【MySQL】深入分析MySQL索引机制的实现
  18. vi(vim)使用入门
  19. 两阶提交、三阶提交、TCC框架
  20. 小心计算机视觉综合征!快来get护眼大法……

热门文章

  1. 第一次用 PHPUnit 写测试就上手(上)
  2. android 朋友圈图文,Android 微信分享图片(好友和朋友圈)
  3. RuntimeError: ‘lengths’ argument should be a 1D CPU int64 tensor, but got 1D cuda:0 Long tensor
  4. perfmon android 7.1,Perfmon - 脚本自动监控
  5. t-paas d-paas_什么是PaaS? 平台即服务的解释
  6. 如何通过反向代理实现伪装IP?
  7. android按钮悬停吸附,Android简单实现悬浮吸附的FloatingView
  8. html做一个条码扫描页面,vue h5页面如何实现扫一扫功能,扫条形码获取编码
  9. poi批量导入导出Excel(一、需要建数据库表)
  10. Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme阅读总结