都知道C语言是面向过程的,但是现在软件规模越来越大,通过面向对象的方式可以简化开发。业余时间想了个简单的方法,在C中使用一部分面向对象的基本功能。由于C语言自身的限制,并不完善,只能将就用,聊胜于无,如果大家有好的想法可以一起讨论。

首先还是老规矩上代码: http://files.cnblogs.com/GhostZCH/object.rar

面向对象有三个基本属性:封装、继承和多态。 此处一一讲解处理方法。

1. 封装,基本思想就是用结构体代替类,属性没什么好说的,方法就麻烦点只能用函数指针了,基本思想和JS差不多,“函数就是对象的一个属性”。 缺点试试无法控制访问的私有和公用。由于C没有this指针,只好在每个函数都增加一个void*的参数将自己传进去。

 
  {
     ClassID m_uiCID;
     ToString_PF pfToString;
 };
 
  {
     sprintf(pcStrBuf,       }
 
 OBJECT_STRU *new_Object()
 {
     OBJECT_STRU* pstObj = (OBJECT_STRU*)malloc( 
          {
              }
 
     pstObj->m_uiCID = CID_OBJ;
     pstObj->pfToString = OBJ_ToString;
 
      }

2继承:继承的方法是用类似组合的方式,将父类结构体作为子类的第一个属性,注意,这里必须是第一个,这样后面的强制类型转换才会有效。通过强制转换转换成父类。

1 /************************************************************************/

           
        
   {
     sprintf(pcStrBuf,                   ((ANIMAL_STRU *)pObj)->acName,
         ((ANIMAL_STRU *)pObj)->m_stBaseObj.m_uiCID);
      }
 
 ANIMAL_STRU *new_Animal()
 {
     ANIMAL_STRU* pstObj = (ANIMAL_STRU*)malloc(     
          {
              }
     
     pstObj->m_stBaseObj.m_uiCID = CID_ANM;
     pstObj->m_stBaseObj.pfToString = ANM_ToString;  ] =      
      }
 

三,多态,通过挂载不同的函数指针实现

] = {};
 
     OBJECT_STRU *pObj = NULL;
     ANIMAL_STRU *pAnm = NULL;
     PLANT_STRU  *pPlt = NULL;
 
           OBJECT_STRU *pObj_plant  = NULL;
 
           printf(     free(pObj);
     pObj = NULL;
    
           strcpy(pAnm->acName,     printf(     free(pPlt);
     free(pAnm);
     pPlt = NULL;
     pAnm = NULL;
 
           strcpy(pPlt->acName,     printf( 
 
                
               pObj_plant  = (OBJECT_STRU *)new_Plant();
 
           printf( 
     getchar();
 
     free(pObj_animal);
     free(pObj_plant );
 
     ;
 }
 

C语言面向对象的简便方法的更多相关文章

  1. python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异

    1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html   1.__init__() 创建对 ...

  2. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

  3. Win2008 IIS7日期时间格式更改最简便方法

    windows2008 这么高级的系统不可能改个系统的日期时间显示格式还要进注册表啊.于是有baidu,google了下终于发现了,原来还有不需要注册表的更简便方法. windows2008默认时间格 ...

  4. C语言面向对象风格编程

    前言 本文略谈C面向对象风格编程,如何使用过程式语言去模拟面向对象的特性?C面向对象的方式和形式很多,不一而足,本文的代码形式是模拟部分C++面向对象关键词并赋予其特性,这种方式对于初级程序员比较好理 ...

  5. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  6. OO开发思想:面向对象的开发方法(Object oriented,OO)

    面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...

  7. 【Java基础】【08面向对象_继承&方法&final】

    08.01_面向对象(代码块的概述和分类)(了解)(面试的时候会问,开发不用或者很少用) A:代码块概述 在Java中,使用{}括起来的代码被称为代码块. B:代码块分类 根据其位置和声明的不同,可以 ...

  8. 现有语言不支持XXX方法

    史上最强大的IDE也会有bug的时候哈,今天遇到这个问题特别郁闷,百度了下,果然也有人遇到过这个问题 解决方法: 1.调用的时候参数和接口声明的参数不一致(检查修改) 2.继承接口中残留一个废弃的方法 ...

  9. 用c语言产生随机数的方法

    用c语言产生随机数的方法 在C语言中,rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列 ...

随机推荐

  1. 用mac自带的safari浏览器下载excel文件后面自带了.exe后缀

    将 Content-Type 设为 application/vnd.ms-excel

  2. [ES6] 22. Const

    'const' keyword is for creating a read only variable, something you can never change once created. ' ...

  3. MySQL对于datetime 源码分析

    http://tsecer.blog.163.com/blog/static/150181720160117355684/   一.时间比较的语法分析 在mysql中,通常时间是一个必不可少的类型,而 ...

  4. [置顶] Android开发之serviceManager分析

    Android 开发之serviceManager分析 在Android系统中用到最多的通信机制就是Binder,Binder主要由Client.Server.ServiceManager和Binde ...

  5. My97DatePicker日期控件使用方法

    My97DatePicker是一款网页版非常简单而且好用的日期控件,其实几年前就使用过了,这次再次用到,总结下: 首先去官网下载地址:http://www.my97.net/dp/down.asp 在 ...

  6. Block块

    block的标志:^ 特点: 1.可以保存代码 2.有返回值 3.有形参 4.调用方式和c语言一样 5.可以访问外部变量,但不能修改变量的值:如果使用__block关键字修饰的变量才可以. 1)创建 ...

  7. 运用json-lib生成特定json

    在实现接口过程中,一般协议都是定义数据格式为json.我们有时候需要把bean转换为JSON输出给接口调用者,但是可能存在bean中的字段有些不是接口定义所需要的.这个时候需要我们对JSON转换是需要 ...

  8. 封装一个ISortable接口

    using System;/// <summary>/// 排序规范/// </summary>/// <typeparam name="T"> ...

  9. 页面嵌套 Iframe 产生缓存导致页面数据不刷新问题

    最近遇到个比较古怪的问题:当页面嵌套多个 Iframe 时会出现 Iframe 里包含的页面无法看到最新的页面信息. 初步解决方案,在 Iframe 指向的页面地址后缀添加一个随机数或者时间戳.这样能 ...

  10. iOS iTunes文件共享

    众所周知苹果不允许用户查看文件,不同的应用之间文件也没有联系.从电脑上往手机传文件,也只能通过开放沙盒目录,传到对应的应用下. 有时候我们需要导入文件到应用沙盒下,或者从沙盒中导出文件.这就需要应用的 ...