免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhujiang73
打印 上一主题 下一主题

我想,理解了 C 的面向对象,也就理解了 C++  关闭 [复制链接]

论坛徽章:
0
71 [报告]
发表于 2008-05-23 18:23 |只看该作者
恩,顶楼上。我本科时没人指点,鬼迷心窍,尽搞些旁门左道,现在后悔得不得了。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
72 [报告]
发表于 2008-05-23 21:24 |只看该作者
原帖由 zhujiang73 于 2008-5-21 15:41 发表


加上成员函数:

#include

typedef struct
{
    void   *p;  
    int     ma;   
} A;

typedef struct
{
    A       parent;
    void    *p;
    int     mb;
} B;


typedef  ...


再加上多态:

#include <stdio.h>

typedef struct
{
&nbsp;&nbsp;&nbsp;&nbsp;void   *p;  
&nbsp;&nbsp;&nbsp;&nbsp;int     ma;
&nbsp;&nbsp;&nbsp;&nbsp;void   (*vshow)(void *this);
} A;

typedef struct
{
&nbsp;&nbsp;&nbsp;&nbsp;A       parent;
&nbsp;&nbsp;&nbsp;&nbsp;void    *p;
&nbsp;&nbsp;&nbsp;&nbsp;int     mb;
&nbsp;&nbsp;&nbsp;&nbsp;char    name[2];
} B;


typedef struct
{
&nbsp;&nbsp;&nbsp;&nbsp;void   (*set_ma)(void *this, int a);  
} AC;

typedef struct
{
&nbsp;&nbsp;&nbsp;&nbsp;AC     parent;
&nbsp;&nbsp;&nbsp;&nbsp;void   (*set_mb)(void *this, int b);  
} BC;

void  A_set_ma(void *this, int a)
{
&nbsp;&nbsp;&nbsp;&nbsp;((A*)this)->ma = a;
}  

void  B_set_mb(void *this, int b)
{
&nbsp;&nbsp;&nbsp;&nbsp;((B*)this)->mb = b;
}

void  B_vshow(void *this)
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("this  is  %s \n", ((B*)this)->name);
}


void  AC_init(AC *pac)
{
&nbsp;&nbsp;&nbsp;&nbsp;pac->set_ma = A_set_ma;  
}

void  BC_init(BC *pbc)
{
&nbsp;&nbsp;&nbsp;&nbsp;AC_init((AC*)pbc);
&nbsp;&nbsp;&nbsp;&nbsp;pbc->set_mb = B_set_mb;
}

void  A_init(A *pa, AC *pac)
{
&nbsp;&nbsp;&nbsp;&nbsp;pa->p = (void*)pac;
}

void  B_init(B *pb, BC *pbc)
{
&nbsp;&nbsp;&nbsp;&nbsp;((A*)pb)->vshow = B_vshow;
&nbsp;&nbsp;&nbsp;&nbsp;pb->p = (void*)pbc;
&nbsp;&nbsp;&nbsp;&nbsp;pb->name[0] = 'B';
&nbsp;&nbsp;&nbsp;&nbsp;pb->name[1] = '\0';
}


int main (int argc, char *argv[])
{
&nbsp;&nbsp;&nbsp;&nbsp;BC  bc;

&nbsp;&nbsp;&nbsp;&nbsp;A   *pa;
&nbsp;&nbsp;&nbsp;&nbsp;B   b1, b2;
&nbsp;&nbsp;&nbsp;&nbsp;B   *pb1, *pb2;

&nbsp;&nbsp;&nbsp;&nbsp;pb1 = &b1;
&nbsp;&nbsp;&nbsp;&nbsp;pb2 = &b2;

&nbsp;&nbsp;&nbsp;&nbsp;BC_init(&bc);

&nbsp;&nbsp;&nbsp;&nbsp;B_init(pb1, &bc);
&nbsp;&nbsp;&nbsp;&nbsp;B_init(pb2, &bc);


&nbsp;&nbsp;&nbsp;&nbsp;((AC*)(pb1->p))->set_ma((void*)pb1, 10);

&nbsp;&nbsp;&nbsp;&nbsp;((AC*)(pb2->p))->set_ma((void*)pb2, 100);

&nbsp;&nbsp;&nbsp;&nbsp;((BC*)(pb1->p))->set_mb((void*)pb1, 20);

&nbsp;&nbsp;&nbsp;&nbsp;((BC*)(pb2->p))->set_mb((void*)pb2, 200);

&nbsp;&nbsp;&nbsp;&nbsp;pa = (A*)pb1;

&nbsp;&nbsp;&nbsp;&nbsp;pa->vshow((void*)pa);

&nbsp;&nbsp;&nbsp;&nbsp;printf("b1.ma = %d   b1.mb = %d \n", b1.parent.ma, b1.mb);

&nbsp;&nbsp;&nbsp;&nbsp;printf("b2.ma = %d   b2.mb = %d \n", b2.parent.ma, b2.mb);


&nbsp;&nbsp;&nbsp;&nbsp;return  0;
}

论坛徽章:
0
73 [报告]
发表于 2008-05-24 08:53 |只看该作者
原帖由 suby 于 2008-5-23 18:14 发表
还是多关注实际项目功能需求比较好,过于拘泥于语言特性反而会迷失方向


大实话,语言特性本身也是跟着实际应用跑的

论坛徽章:
0
74 [报告]
发表于 2008-05-24 13:29 |只看该作者
原帖由 lipingtababa 于 2008-5-23 08:40 发表
国家税务总局前些日子发文:现在吹牛要上税了,各位注意


的确要上税了。不然就没有边了。

论坛徽章:
0
75 [报告]
发表于 2008-05-24 17:48 |只看该作者

回复 #1 zhujiang73 的帖子

C++确实与C有很多共同点,但是面向对象并不止如此。有机会你可以看看UML,它是怎么实现一个项目的,我个人认为UML还算在面向对象方面的典型。

论坛徽章:
0
76 [报告]
发表于 2008-05-27 22:11 |只看该作者
向各位前辈学习了。

论坛徽章:
0
77 [报告]
发表于 2008-05-27 23:18 |只看该作者
我来学习的

论坛徽章:
0
78 [报告]
发表于 2008-05-30 01:11 |只看该作者
个人认为C不用搞什么OO,有意义么?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:03
79 [报告]
发表于 2008-06-04 14:21 |只看该作者
原帖由 zhujiang73 于 2008-5-20 14:43 发表
最简单的继承:

#include

typedef struct
{  
    int ma;
} A;

typedef struct
{
    A parent;
    int mb;
} B;

int main (int argc, char *argv[])
{
    B   b;
    B   *pb;    ...



____________________________________________

typedef struct
{
    A parent;
    int mb;
} B;

改成

typedef struct
{   
    int mb;
    A parent;
} B;

這樣就不行是吧?

一定要把 parent 放最前面 才能模擬繼承 是嗎?

謝謝

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
80 [报告]
发表于 2008-06-04 17:08 |只看该作者
原帖由 shihyu 于 2008-6-4 14:21 发表

一定要把 parent 放最前面 才能模擬繼承 是嗎?

...


是,一定要把 parent 放最前面。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP