首页
社区
课程
招聘
[旧帖] [讨论]c语言如何实现或者模拟面向对象编程 0.00雪花
发表于: 2009-5-13 14:19 4473

[旧帖] [讨论]c语言如何实现或者模拟面向对象编程 0.00雪花

2009-5-13 14:19
4473
昨天做了一个面试题, 如上

虽然实际的生活中,不会有人用c语言进行面向对象的编程, 但是我想用c语言来模拟面向对象的封装、继承和多态也是一件比较有挑战和乐趣的事情, 不知道大家如何看?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 210
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用结构体模拟对象把
2009-5-13 14:42
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
这是我写的一个简单的模拟

/***********************************************\
*  cclass.c  c语言模拟的继承和多态
\***********************************************/

#include <stdio.h>
#include <windows.h>

#pragma warning(disable:4113)
#pragma warning(disable:4133)

#define class struct
#define virtual
#define MAX_FUNC    8

typedef void (*PFUNC)(void);

typedef void (*vtable[MAX_FUNC])();

// 基类
class CBase
{
    class    CBase*    this;   // 指向自己的指针
    vtable    vptr;              // 虚拟函数表

    virtual void    (*SetValue)(int value);   // 虚拟函数
    virtual    void    (*ShowValue)();        // 虚拟函数
    int        m_data;                             // 成员变量
};

class CDerived
{
    class CBase*    pBase;    // 继承父类

    vtable    vptr;               // 虚拟函数表

    virtual void    (*SetValue)(int value);   // 虚拟函数
    virtual    void    (*ShowValue)();        // 虚拟函数

    virtual void    (*SetMsg)(char* pMsg);  // 虚拟函数
    virtual void    (*ShowMsg)();              // 虚拟函数
    char    m_msg[256];                          // 子类的成员变量

};

void ShowValue(class CBase* pBase)
{
    printf("%d\n", pBase->m_data);
}

void SetValue(int value, class CBase* pBase)
{
    pBase->m_data = value;
}

void SetMsg(char* pMsg, class CDerived* pDerived)
{
    wsprintf(pDerived->m_msg, "%s", pMsg);
}

void ShowMsg(class CDerived* pDerived)
{
    printf("%s\n", pDerived->m_msg);
}

// 基类构造函数
void CBase(class CBase* pBase)
{
    pBase->this = pBase;
    pBase->SetValue = SetValue;
    pBase->ShowValue = ShowValue;
    pBase->vptr[0] = pBase->SetValue;
    pBase->vptr[1] = pBase->ShowValue;
}

// 子类构造函数
void CDerived(class CDerived* pDerived)
{
    class CBase* pBase = (class CDerived*)pDerived;
    pDerived->pBase = (class CBase*)pDerived;
   
    CBase((class CBase*)pBase);
    pDerived->SetMsg = SetMsg;
    pDerived->vptr[2] = pDerived->SetMsg;
    pDerived->ShowMsg = ShowMsg;
    pDerived->vptr[3] = pDerived->ShowMsg;
}

int main(int argc, char* argv[])
{
      class CBase b1, b2;     
      class CDerived d1, d2;

       CBase(&b1);   // 基类对象1构造
       CBase(&b2);   // 基类对象2构造
       CDerived(&d1);  // 子类对象1构造
       CDerived(&d2);  // 子类对象2构造

       b1.SetValue(3);
       b1.ShowValue();

       b2.SetValue(4);
       b2.ShowValue();  // b1, b2 都调用ShowValue, 但结果不一样,呈现多态

       d1.SetValue(7);
       d1.ShowValue();

       d2.SetValue(8);
       d2.ShowValue();  // d1, d2 继承父类的SetValue, ShowValue, 结果也不一样, 呈现多态

       d1.SetMsg("This is d1.");
       d1.ShowMsg();
      
       d2.SetMsg("This is d2");
       d2.ShowMsg();    // SetMsg, ShowMsg是子类的虚函数,父类无法使用

       CBase(&d1);       // 用基类来构造子类对象
       d1.SetValue(10);
       d1.ShowValue();

       return 0;
}

程序运行结果:
3
4
7
8
This is d1.
This is d2
10
2009-5-13 15:06
0
雪    币: 233
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有个电子书你可以看一下,
《Object-Oriented Programming With ANSI-C》

http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
2009-5-13 15:52
0
雪    币: 339
活跃值: (10)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
5
很复杂的工程,以前好像看过:其实C的结构体非常类似于类,不过还是有几点差异:
(1)struct结构体的成员默认是公共的,而非私有
(2)难以实现多态(我个人看法)
2009-5-13 15:55
0
雪    币: 1283
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
各种域的访问,还是要自己来控制,看看当前的那么多脚本的代码就明了
Python等,不都是C编写的。可以研究一下
2009-5-13 16:41
0
雪    币: 87
活跃值: (25)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
结构体。3楼代码的思路挺清晰的
2009-5-13 16:54
0
雪    币: 227
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
linux的源代码里面就用到了大量的面向对象思想。
2009-9-18 12:29
0
游客
登录 | 注册 方可回帖
返回
//