都知道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. qt软键盘输入

      characterapplicationsignalqt输入法object 1.从QInputContext派生自己的InputContext类 ,例如: class MyInputPanelCo ...

  2. 【转】获取Sprite的实际Rect

    判断点击是否点击在了一个精灵上, 其实就是判断一个点是否在一个矩形内. cocos2d-x的2.0.2版本可以使用CCRect的函数 bool CCRect::containsPoint(const ...

  3. VOA学习-South Sudan Must Allow Aid

    South Sudan Must Allow Aid The United States is gravelyconcerned by the serious escalation of the hu ...

  4. 嵌入式Linux-GNU Make 使用手册(中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 译者注:本人在阅读Linux源代码过程中发现如果要全面了解Linux的结构.理解Linux的编程总体设计及思想必须首先全部读通Linux源代码中各级 ...

  5. create database xx 或者show database 没有任何反应

    命令是以:结束的,你忘记了,记住,是英文状态下的:

  6. 关于IB_DESIGNABLE / IBInspectable的那些事

    前言 IB_DESIGNABLE / IBInspectable 这两个关键字是在WWDC 2014年”What’s New in Interface Builder”这个Session里面,用Swi ...

  7. nodejs创建ejs工程

    <Node.js开发指南>创建ejs项目的命令为: express -t ejs microblog.执行后,创建的是jade项目.在express3.x,express4.x中创建ejs ...

  8. 导出EXCEL数据时防止数值变科学计数的办法

    网上有很多说法,最简单直接正确的做法是判断一下是否为数值以及长度,然后给单元格加上以下CSS即可: mso-generic-font-family:auto;   mso-font-charset:1 ...

  9. IP地址基础知识

    IP地址基础知识 网络号:用于识别主机所在的网络:主机号:用于识别该网络中的主机. 一 OSI/RM模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 二 TCP/IP模型 数据链路层( ...

  10. webrtc学习——mediaStream和MediaStreamTrack

    This is an experimental technologyBecause this technology's specification has not stabilized, check ...