纯C语言实现面向对象分析与示例分享

采用 语言实现的关键是如何运用 语言本身的特性来实现多态、继承面、封装的面向对

C C

象的特征最近给出了例子,大家可以参考使用

,

C语言的对象化模型

面向对象的特征主要包括:

.封装,隐藏内部实现

.继承,复用现有代码

.多态,改写对象行为

1.1 封装

封装是一种信息隐蔽技术,它体现于类的说明,是对象的重要特性。封装使数据和加工该数

据的方法 (函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外

特性 (对象能接受哪些消息,具有那些处理能力),而对象的内特性 (保存内部状态的私有

数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的

使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。

在C语言中,大多数函数的命名方式是动词+名词的形式,例如要获取一个semaphore,会

命名

成take_semaphore,重点在take这个动作上。面向对象编程中刚好相反,命名为rt_sem_

take,即名词+动词的形式,重点在名词上,体现了一个对象的方法。另外对于某些方法,

仅局限在对象内部使用,它们将采用static修辞把作用范围局限在一个文件的内部。通过

这样的方式,把一些不想让用户知道的信息屏蔽在封装里,用户只看到了外层的接口,从而

形成了面向对象中的最基本的对象封装实现。

一般属于某个类的对象会有一个统一的创建,析构过程。

对象内存数据块已经存在,需要对它进行初始化 –rt_sem_init;对象内存数据块还未分配,

需要创建并初始化 –rt_sem_create。可以这么认为,对象的创建(create)是以对象的初

始化(init)为基础的,创建动作相比较而言多了个内存分配的动作。

相对应的两类析构方式:

.由rt_sem_init初始化的semaphore对象 –rt_sem_detach;

.由rt_sem_create创建的semaphore对象 –rt_sem_delete.

1.2 继承

继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继

承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承 (一个子类只

有一父类)和多重继承 (一个类有多个父类,当前RT-Thread的对象系统不能支持)。类的

对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不

仅支持系统的可重用性,而且还促进系统的可扩充性。

类似的实现代码如下程序清单:

复制代码 代码如下:

/* 父类 */

struct parent_class

{

int a, b;

char *str;

};

/* 继承于父类的子类 */

struct child_class

{

struct parent class p;

int a, b;

};

/* 操作示例函数*/

void func()

{

struct child_class obj, *obj_ptr; /* 子类对象及指针 */

struct parent_class *parent_ptr; /* 父类指针 */

obj_ptr &obj;

/* 取父指针 */

parent_ptr (struct parent*) &obj;

/* 可通过转换过类型的父类指针访问相应的属性 */

parent ptr->a 1;

parent ptr->b 5;

/* 子类属性的操作 */

obj ptr->a 10;

obj ptr->b 100;

}

在上面代码中,注意child_class结构中第一个成员p,这种声明方式代表child_class类

型的数据中开始的位置包含一个parent_class类型的变量。在函数func中obj是一个chi

ld_class对象,正像这个结构类型指示的,它前面的数据应该包含一个parent_class类型

的数据。在第21行的强制类型赋值中parent_ptr指向了obj变量的首地址,也就是obj

变量中的p对象。好了,现在parent_ptr指向的是

一个真真实实的parent类型的结构,那么可以按照parent的方式访问其中的成员,当然也

包括可以使用和parent结构相关的函数来处理内部数据,因为一个正常的,正确的代码,

它是不会越界访问parent结构体以外的数据。经过这基本的结构体层层相套包含,对象简

单的继存关系就体现出来了:父对象放于数据块的最前方,代码中可以通过强制类型转换获

c语言实现协议层层消息,纯C语言实现面向对象分析与示例分享.pdf相关推荐

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

    #include #include //接口 #ifndef Interface #define Interface struct #endif //类 #ifndef Class #define C ...

  2. c语言坦克大战程序设计,用纯C语言实现坦克大战

    好久没给大家看有意思的C语言实现的代码了,今天给大家分享一个C语言实现坦克大战的游戏源码,依旧是纯C语言,点c文件,但是是在TC的环境下,运行效果截图如下: 上下左右控制方向,空格为发射炮弹,还带声音 ...

  3. 【MATLAB库函数系列】resample(重采样函数)的C语言实现【姊妹篇2纯C语言实现】

    resample的原理 MATLAB中resample函数最简单的参数如下: y = resample(x,p,q) 以p/q乘以原始采样速率对输入序列x重新采样.resample在x上应用抗锯齿FI ...

  4. MATLAB库函数upfirdn(分数倍采样率变换)的C语言实现【姊妹篇2纯C语言实现】

    upfirdn原理 yout = upfirdn(xin,h,p,q) upfirdn的功能在MATLAB官方帮助文档中说得很清楚 通过插零实现 p p p倍上采样 对上采样之后的信号用给定的 h h ...

  5. C语言黑白bmp转字节流,纯C语言对BMP图像的灰度化二值化

    #include "Windows.h" #include #include //using namespace std; // 这个动态申请二维内存(指针数组)的函数很有意思 t ...

  6. 服务器云ide_语言服务器协议如何影响IDE的未来

    服务器云ide The release of Visual Studio Code single-handedly impacted the developer ecosystem in such a ...

  7. Visual Studio 编写纯C语言程序

    本篇文章讲述如何用微软的 Visual Studio 编写纯C语言程序,这里的纯C语言,指的是 ANSI C 语言. 要在 Visual Studio 里创建一个 ANSI C语言程序,请按以下步骤执 ...

  8. visual studio 如何编写c语言程序,用Visual Studio 编写纯C语言程序

    本篇文章讲述如何用微软的 Visual Studio 编写纯C语言程序,这里的纯C语言,指的是 ANSI C 语言. 要在 Visual Studio 里创建一个ANSI C语言程序,请按以下步骤执行 ...

  9. 用ram实现寄存器堆_纯C语言实现bootloader

    之前有用很少一部分汇编实现过bootloader,但经过后来慢慢改进,发现是可以用纯C语言实现嵌入式操作系统的引导. 下面是之前对不能完全使用C语言引导系统的几点说明: 1.C程序中所有的代码都是以函 ...

最新文章

  1. mxnet slice_axis
  2. s2sh乱码一个小处理(新手按流程走)
  3. MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)
  4. 将一个简单远程调用的方式例子改为异步调用 -- 2
  5. C语言程序main入口函数
  6. c#之using关键字
  7. 漫画:图的 “最短路径” 问题 | 技术头条
  8. cv2 imwrite中文路径_python3下使用cv2.imwrite存储带有中文路径图片的方法
  9. datagridview 手动添加的行如何进行重载_【厚积薄发】如何规划UI图标图集
  10. 六条“黑客伦理”(hacker ethic)
  11. 使用php第三方包mpdf将网页装换成pdf文件【2】
  12. opencv 实现等值线_OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)...
  13. 内存分配失败错误处理
  14. python统计表中单词及其出现的次数 字典形式输出_Python统计文本词汇出现次数的实例代码...
  15. java从0单排之java就业培训教程复习与面试题回顾——03
  16. RoboWare Studio入门教程(一)
  17. chm sharp安卓版_CHM Sharp(CHM阅读器)
  18. java课程设计 成绩_Java课程设计—学生成绩管理系统(201521123005 杨雪莹)
  19. idea里面解决jsp,html,xml黄色背景的方法
  20. 阻止浏览器默认行为事件

热门文章

  1. linux device_create_file属性 怎么调用,device_create_file创建多级目录
  2. vscode 语法检查_Jenkins 声明式流水线的语法错误检查
  3. Java集合源码解析之ArrayList
  4. 【可观测之ELK】elk+logback+redis 搭建日志平台
  5. 单片机r6/r7c语言怎么用,关于单片机C51中c语言函数(-nop-())?
  6. java动态删除map元素报错_java map使用迭代器遍历时执行删除元素报空指针异常
  7. 销售系统软件mysql_Max(TM)销售管理系统
  8. Java 设计模式之 Observer 模式
  9. java flink使用addSink方法保存流数据到redis
  10. python正则表达式使用修饰符