奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 程序开发 >> C语言 >> C语言中的面向对象(2)-C语言的多态实现
程序开发
Asp
PHP
JSP
CGI/Perl
XML
.Net
C/C++/C#
Visual Basic
Visual C++
Delphi
Java
汇编语言
  • Tomcat5.0.28下AXIS完

  • JSP环境的配置过程(J

  • 用JAVA写一个日志类程

  • 高质量C++/C编程手册完

  • 菜鸟问与答(怎样产生随

  • 怎样在一个程序后面运

  • Linux下面如何进行C语

  • C语言漫谈

  • C语言中的面向对象(2)-C语言的多态实现
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-21

    C语言中的面向对象(2)-C语言的多态实现:

      相信很多人都看过设计模式方面的书,大家有什么体会呢?Bridge,Proxy,Factory这些设计模式都是基于抽象类的。使用抽象对象是这里的一个核心。
          
      其实我觉得框架化编程的一个核心问题是抽象,用抽象的对象构建程序的主体框架,这是面向对象编程的普遍思想。用抽象构建骨架,再加上多态就形成了一个完整的程序。由于C++语言本身实现了继承和多态,使用这样的编程理念(理念啥意思?跟个风,嘿嘿)在C++中是十分普遍的现象,可以说Virtual(多态)是VC的灵魂。
     
      但是,使用C语言的我们都快把这个多态忘光光了。我常听见前辈说,类?多态?我们用的是C,把这些忘了吧。很不幸的是,我是一个固执的人。这么好的东西,为啥不用呢。很高兴的,在最近的一些纯C代码中,我看见了C中的多态!下面且听我慢慢道来。
     
      1. VC中的Interface是什么

      Interface:中文解释是接口,其实它表示的是一个纯虚类。不过我所要说的是,在VC中的Interface其实就是struct,查找Interface的定义,你可以发现有这样的宏定义:

           #Ifndef Interface
           #define Interface struct
           #endif

      而且,实际上在VC中,如果一个类有Virtual的函数,则类里面会有vtable,它实际上是一个虚函数列表。实际上C++是从C发展而来的,它不过是在语言级别上支持了很多新功能,在C语言中,我们也可以使用这样的功能,前提是我们不得不自己实现。
     
      2.C中如何实现纯虚类(我称它为纯虚结构)

      比较前面,相信大家已经豁然开朗了。使用struct组合函数指针就可以实现纯虚类。

      例子:

         typedef struct {
            void  (*Foo1)();
            char  (*Foo2)();
            char*  (*Foo3)(char* st);
        }
        MyVirtualInterface;
          
      这样假设我们在主体框架中要使用桥模式。(我们的主类是DoMyAct,接口具体实现类是Act1,Act2)下面我将依次介绍这些“类”。(C中的“类”在前面有说明,这里换了一个,是使用早期的数组的办法)
     
      主类DoMyAct: 主类中含有MyVirtualInterface* m_pInterface; 主类有下函数:

        DoMyAct_SetInterface(MyVirtualInterface* pInterface)
        {
            m_pInterface= pInterface;
        }
        DoMyAct_Do()
        {
            if(m_pInterface==NULL) return;
            m_pInterface->Foo1();
            c=m_pInterface->Foo2();
        }

      子类Act1:实现虚结构,含有MyVirtualInterface  st[MAX]; 有以下函数:

        MyVirtualInterface* Act1_CreatInterface()
        {
            index=FindValid() //对象池或者使用Malloc !应该留在外面申请,实例化
            if(index==-1) return NULL;
            St[index].Foo1=Act1_Foo1; // Act1_Foo1要在下面具体实现
            St[index].Foo2=Act1_Foo2;
            St[index].Foo3=Act1_Foo3;
            Return &st [index];
        }

      子类Act2同上。
     
      在main中,假设有一个对象List。List中存贮的是MyVirtualInterface指针,则有:

        if( (p= Act1_CreatInterface()) != NULL)
        List_AddObject(&List, p); //Add All
     
        While(p=List_GetObject()){
            DoMyAct_SetInterface(p);//使用Interface代替了原来大篇幅的Switch Case
            DoMyAct_Do();//不要理会具体的什么样的动作,just do it
        }
     
        FREE ALL

    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.