比如在一个项目中,有大量的数据结构,他们都是双向链表,但又想共用一套对链表的操作算法,这怎么做到呢,C中又没有C++中的继承,不然我可以继承一父(类中只有两个指针,一个向前一个向后),而其算法可以写在你类中的虚函数中,供子类使用。如:

class Links
{
public:
    Links* back;
    Links* forword;

virtual Add(){ ... };
    virtual Del(){ ... };
    virtual Ins(){ ... };
    virtual Print() =0;
    ....

};

于是对于特定的数据结构我们可以:
class mylinks : public Links
{
public:
    char* myname;
    char sex;
    int  age;
    ...
    virtual Print(){ .... }

};
对其操作时都可以使用你类的泛型算法。

在C中,该如何做呢?我们用C中的指针和强制类型转可以做到。

下面是我总结出来的一个小的程序,体现了用指针的弹性来实现这一继承的效果:
(我在Liniux下的GCC调试通过)

=======================================

#include <stdio.h>

/* 双向链表 (类似于父类)*/
typedef struct hLinks{
   struct hLinks *bwLink;
   struct hLinks *fwLink;
} hLinks;

/*
 * 一个使用双向链表的结构
 *     (类似于子类)
 */
typedef struct hEnt{
   hLinks links;
   int hData;
   char key[10];
} hEnt;

/*
 *  双向链插入泛型算法 (类似于父数中的成员函数)
 */
Insert( hLinks* elem, hLinks *dest )
{
   if ( !elem || !dest ) return;

elem->bwLink = dest->bwLink;
   elem->fwLink = dest;
   dest->bwLink->fwLink = elem;
   dest->bwLink = elem;
}

/*
 *  打印 (类似于子类重载父类的成员函数)
 */
PrintLink( hLinks *h )
{
    hEnt *p ;

for( p = ( hEnt* ) h->fwLink;     /*  <-----------把hLink再转回来  */
         p != ( hEnt* ) h;
         p = ( hEnt* )( (hLinks*)p )->fwLink )
    {
       printf("hData=[%d], key=[%s]/n", p->hData, p->key);
    }
}

main()
{
   hLinks head;
   hEnt a[4];
   int i;

head.bwLink = &head;
   head.fwLink = &head;

for(i=0;i<4;i++)
   {
      a[i].hData = i*10;
      sprintf(a[i].key,"id=%d", i);

/*  使用泛型算法构造双向链  */ 
      Insert( (hLinks *) &a[i], (hLinks *) &head ); /*   <-----注意这个强制转换  */
   }

PrintLink( (hLinks *) &head ); /*   <-------也注意这个强制转换  */
}

其实,C++就是把C++翻译成C,再编译,所以编译好慢。我这里的这个动作可能类似C++转成C后的样子吧

用C写有面向对象特点的程序的更多相关文章

  1. python面向对象编程小程序- 选课系统

    选课系统 花了一晚上写的,可能还存在不足 1.程序框架 2.文件夹建立 D:/选课系统 |___api | |___common_api.py |___bil | |___common.py |___ ...

  2. c语言里用结构体和指针函数实现面向对象思想

    一.基础研究 观察如下两个程序a.c和b.c: A.c: B.c: 这两个程序都是要实现在屏幕上第10行40列打印一个绿色的字符c: 这两个程序的数据组织方式是一样的,都是使用结构体,而且对共性和个性 ...

  3. C语言:使用结构体和指针函数实现面向对象思想(OO编程)

    原文:https://www.linuxidc.com/Linux/2016-12/138789.htm 有关:<C语言:过年回家 发现只有我没有对象> 一.基础研究 观察如下两个程序a. ...

  4. C语言结构体的强制类型转换

    陈浩师兄03年的一篇博客<用C写有面向对象特点的程序>描述了用C语言来实现类似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换 ...

  5. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  6. 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数

    很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...

  7. python基础(八)面向对象的基本概念

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 谢谢逆水寒龙,topmad和Liqing纠错 Python使用类(class)和对 ...

  8. php面向对象学习笔记

    PHP 面向对象技术(全面讲解) Ø 主要内容 v 1.面向对象的概念 v 2.什么是类,什么是对象,类和对象之间的关系 v 3.什么是面向对象编程呢? v 4.如何抽象出一个类? v 5.如何实例化 ...

  9. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js

    Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一  三个基本的特性:封装.继承与多态1 1.2. 魔 ...

随机推荐

  1. C#.NET常见问题(FAQ)-如何声明list的多维数组

    可以用下面的方法来声明多维list数组,但是不推荐使用   //对于一维数组:List<数据类型> 变量 = new List<数据类型>(); List<int> ...

  2. Linux中最常用的JAVA_HOME配置

    一.配置 更改下面配置中的JAVA_HOME路径为你的路径. export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el7_ ...

  3. MYSQL SELECT FOR UPDATE

    问题说明: 最近遇到一个问题,多个WORKER同时向MYSQL数据库请求任务,如何实现互斥?例如: SELECT * FROM student WHERE id > 10 LIMIT 100; ...

  4. python知识合集

    python安装包管理  http://www.cnblogs.com/wilber2013/p/4769467.html python pip安装源管理:pypi官网的源不太好,网速慢,容易造成包下 ...

  5. javascript string replace 正则替换

    利用正则式实现首字母大写,丧心病狂是不是?好好的substr不用. JavaScript replace() 方法 r = /^(.)(?=.*)/; str = 'abc'; var str2 = ...

  6. Nutch的安装和配置

    Nutch是一个Java实现的网络爬虫.Nutch的安装可以使用二进制包,也可以使用源代码安装.这里介绍用二进制包安装. 1. 下载apache-nutch-1.12-bin.tar.gz,并且解压, ...

  7. @Service注解的使用

    首先,在applicationContext.xml文件中加一行: <context:component-scan base-package="com.hzhi.clas"/ ...

  8. C++11新特性之 std::forward(完美转发)(转)

    我们也要时刻清醒,有时候右值会转为左值,左值会转为右值. (也许“转换”二字用的不是很准确) 如果我们要避免这种转换呢? 我们需要一种方法能按照参数原来的类型转发到另一个函数中,这才完美,我们称之为完 ...

  9. Java泛型的PECS原则

    1.什么是PESC ? PESC  = producer-extens , consumer -super. 如果参数化类型表示一个 T 生产者,就使用 <? extends T>: 如果 ...

  10. excel如何快速更改表格边框的颜色

    1.当完成基本的表格设置之后,对颜色不甚满意,怎么办 2.重新给表格选择一种颜色,这里会出现一个“笔”形状的鼠标箭头,不用理睬她 3.再次给表格统一加边框即可(开始--边框--所有框线)