Chinaunix

标题: 我想,理解了 C 的面向对象,也就理解了 C++ [打印本页]

作者: zhujiang73    时间: 2008-05-19 16:49
标题: 我想,理解了 C 的面向对象,也就理解了 C++
我想,理解了 C 的面向对象,也就理解了 C++ 。其实基本原理是一样的,只是 C++ 把一些工作自动化了。 最近在学 Gtk 中的对象系统 GObject ,顺便对比了一下 CU 中出了名的 oioic ,看来 oioic 的作者有一定水平,可惜他经常做些出格的事情。
作者: converse    时间: 2008-05-19 16:57
其实什么C的面向对象实现起来也不难,只要你理解了C++

作者: flw    时间: 2008-05-19 17:00
初学 OO 的话,还是从一个支持 OO 语法的语言开始吧。
当然,并不是说 C 就不可以 OO,
而是说,
无论是梁羽生笔下吕四娘的飞花摘叶皆可伤人,还是金庸笔下令狐冲的无招胜有招,
都是指融会贯通之后的一种上层境界,
一开始就奔着这个目标去,那是行不通的。

因此,用 C 去搞什么面向对象,得先有别的 OO 基础才行,否则那是噩梦。

[ 本帖最后由 flw 于 2008-5-19 17:04 编辑 ]
作者: ypxing    时间: 2008-05-19 17:15
与面向过程相比,
面向对象提供了另外一种对现实问题建模的方法

面向对象语言只是对这种建模方式的支持

使用者(编程者)并不关心你的面向对象语言是怎么来的,
只关心该语言能不能提供面向对象建模时所需要描述的语义与逻辑,
效率如何等等

C,C++,java等等根本就不能随便比较谁好谁不好,
他们跟要面对的问题,使用者的背景等有很大的关系
作者: system888net    时间: 2008-05-19 17:21
原帖由 ypxing 于 2008-5-19 17:15 发表
与面向过程相比,
面向对象提供了另外一种对现实问题建模的方法

面向对象语言只是对这种建模方式的支持

使用者(编程者)并不关心你的面向对象语言是怎么来的,
只关心该语言能不能提供面向对象建模时所 ...


赞同
作者: ypxing    时间: 2008-05-19 17:23
最理解面向对象的是习惯于使用面向对象方法建模的人,虽然他们并不见得会使用面向对象语言
最不理解面向对象的是计算机,

面向对象语言只是将面向对象建模者的思想转换为计算机能认识的01

我认为,建模方法与支持该建模方法的语言的关系是:
(1)先有建模方法,再有支持该建模方法的语言
(2)先有支持某种建模方法的语言,再让人们去使用和适应这种建模方法和语言是荒唐的

[ 本帖最后由 ypxing 于 2008-5-19 17:25 编辑 ]
作者: net_robber    时间: 2008-05-19 17:36
似乎曾经说过,我的观点:面向对象是模块化设计的一种高级阶段,当项目不是很小以后,进行模块划分的一种抽象方法。

跟语言没关系
作者: zhujiang73    时间: 2008-05-19 21:41
原帖由 converse 于 2008-5-19 16:57 发表
其实什么C的面向对象实现起来也不难,只要你理解了C++



我是学了 C++ 以后,想了解  C++ 编译器自己默默做了什么工作。 参考 C 的面向对象实现,有助于理解 C++ 编译器的工作,因为 C 面向对象的实现过程在源码里都能看见,而最后的效果和 C++ 相似。
作者: eftp    时间: 2008-05-19 22:00
原帖由 ypxing 于 2008-5-19 17:15 发表
与面向过程相比,
面向对象提供了另外一种对现实问题建模的方法

面向对象语言只是对这种建模方式的支持

使用者(编程者)并不关心你的面向对象语言是怎么来的,
只关心该语言能不能提供面向对象建模时所 ...


支持
作者: eftp    时间: 2008-05-19 22:01
原帖由 ypxing 于 2008-5-19 17:23 发表
最理解面向对象的是习惯于使用面向对象方法建模的人,虽然他们并不见得会使用面向对象语言
最不理解面向对象的是计算机,

面向对象语言只是将面向对象建模者的思想转换为计算机能认识的01

我认为,建模方 ...



支持
作者: eftp    时间: 2008-05-19 22:02
原帖由 net_robber 于 2008-5-19 17:36 发表
似乎曾经说过,我的观点:面向对象是模块化设计的一种高级阶段,当项目不是很小以后,进行模块划分的一种抽象方法。

跟语言没关系



支持
作者: eftp    时间: 2008-05-19 22:03
原帖由 zhujiang73 于 2008-5-19 21:41 发表



我是学了 C++ 以后,想了解  C++ 编译器自己默默做了什么工作。 参考 C 的面向对象实现,有助于理解 C++ 编译器的工作,因为 C 面向对象的实现过程在源码里都能看见,而最后的效果和 C++ 相似。



支持
作者: redspider    时间: 2008-05-20 08:29
同意 yupxing,只是一部分人认为OO的就是好的、先进的,这种思想造成了对支持OO的语言的盲目吹捧,以至于一些语言也以纯OO为口号。其实即便是完全支持OO语法的 C++ 也并不认为 OO 是万金油。我喜欢 C++、Perl 的部分原因就是它们为用户提供尽可能多的解决方式,而不是逼迫用户去怎么做 。
作者: cugb_cat    时间: 2008-05-20 09:40
黑猫白猫,抓到耗子就是好猫
作者: doctorjxd    时间: 2008-05-20 10:07
《Inside C++ Object Model》是我喜爱的一本书,也推荐给大家。
作者: ypxing    时间: 2008-05-20 10:11
Great book!!!
强烈推荐

原帖由 doctorjxd 于 2008-5-20 10:07 发表
《Inside C++ Object Model》是我喜爱的一本书,也推荐给大家。

作者: eftp    时间: 2008-05-20 10:14
原帖由 cugb_cat 于 2008-5-20 09:40 发表
黑猫白猫,抓到耗子就是好猫


耗子也有区别呀: 公耗子,母耗子,大耗子,小耗子,肥耗子,瘦耗子,死耗子,活耗子,有病的耗子,健康的耗子。。。。。。。。。。。
作者: eftp    时间: 2008-05-20 10:31
原帖由 doctorjxd 于 2008-5-20 10:07 发表
《Inside C++ Object Model》是我喜爱的一本书,也推荐给大家。


记得刚开始学C++时,噢,C++真不错。
等真正了解C++后,咳,C++太糟糕了!
作者: converse    时间: 2008-05-20 10:39
原帖由 doctorjxd 于 2008-5-20 10:07 发表
《Inside C++ Object Model》是我喜爱的一本书,也推荐给大家。


卖了很多C++的书,现在就剩几本是不卖的:
<<C++ Primer>>
<<Effective c++>>
<<深度探索C++物件模型>>
<<STL源码剖析>>

卖掉的C++书包括<<C++标准库>>,<<Exceptional c++>>等.
作者: ypxing    时间: 2008-05-20 10:48
标题: 回复 #18 eftp 的帖子
还是那句话,
每个人的习惯和特点不同,别人也不会强迫你。

所有人都说一样东西好,跟所有人都说一样东西不好,同样恐怖。
作者: eftp    时间: 2008-05-20 11:00
我想,OIOIC的作者会有一天到这里来与大家畅谈的。
作者: yanjun1    时间: 2008-05-20 13:13
原帖由 flw 于 2008-5-19 17:00 发表
初学 OO 的话,还是从一个支持 OO 语法的语言开始吧。
当然,并不是说 C 就不可以 OO,
而是说,
无论是梁羽生笔下吕四娘的飞花摘叶皆可伤人,还是金庸笔下令狐冲的无招胜有招,
都是指融会贯通之后的一种上 ...



这个比喻不错...呵呵
作者: cugb_cat    时间: 2008-05-20 13:26
原帖由 eftp 于 2008-5-20 11:00 发表
我想,OIOIC的作者会有一天到这里来与大家畅谈的。

与大家畅谈并得到大家的认可需要谦虚的态度。
作者: haoji    时间: 2008-05-20 13:35
原帖由 eftp 于 2008-5-20 11:00 发表
我想,OIOIC的作者会有一天到这里来与大家畅谈的。


畅谈可以, 吹牛不行。
作者: hzcgz    时间: 2008-05-20 14:13
23楼和24楼的好像没有理解21楼话的意思啊!
作者: yuanchengjun    时间: 2008-05-20 14:31
面向对象是一种效果,或者说是一种使用模式。
C可以,只不过自己做起来比较麻烦。

oioic在海边捡到一个有些漂亮的石头,就狂喊:“哇靠,太漂亮了,简直全世界在我手里!”
作者: zhujiang73    时间: 2008-05-20 14:43
标题: 回复 #8 zhujiang73 的帖子
最简单的继承:

#include <stdio.h>

typedef struct
{  
    int ma;
} A;

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

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

    pb = &b;

    ((A*)pb)->ma = 1;
    pb->mb = 2;

    printf("b.ma = %d   b.mb = %d \n", b.parent.ma, b.mb);

    return  0;
}

作者: yuanchengjun    时间: 2008-05-20 16:36
标题: nod
试一下多态?
作者: forlorngenius    时间: 2008-05-20 18:46
最近 关于oioic 的广告狂多
作者: biuuw    时间: 2008-05-20 19:35
面向对象,不懂。

写了这么多的代码,做了这么多的项目,都是面向过程。
难道面向过程不行了?
作者: uppet    时间: 2008-05-20 20:59
有点儿像是oioic的托儿~~

要严肃学习面向对象思想的话,建议把Smalltalk认真学习一下。
作者: ouland    时间: 2008-05-20 22:09
什么是面向对象?
这种问题的讨论某天就象讨论某语言快要消亡。
作者: kioo    时间: 2008-05-21 02:14
好久没发帖,来看看我是哪年注册的
作者: redor    时间: 2008-05-21 08:00
原帖由 converse 于 2008-5-19 16:57 发表
其实什么C的面向对象实现起来也不难,只要你理解了C++



这个有点操蛋....
C还可以实现模板......
说白了C++也就是给傻瓜用的C
作者: redor    时间: 2008-05-21 08:02
原帖由 kioo 于 2008-5-21 02:14 发表
好久没发帖,来看看我是哪年注册的


我好像都比你早几个月.....
作者: redspider    时间: 2008-05-21 08:54
原帖由 redor 于 2008-5-21 08:00 发表



这个有点操蛋....
C还可以实现模板......
说白了C++也就是给傻瓜用的C

    你再说白点,是不是 C就是给傻瓜用的汇编? 汇编就是给傻瓜用的 机器码?机器码就是给傻瓜用的电路插线板?
作者: openq    时间: 2008-05-21 09:08
只要你了解面向对象的几个要点,就不会说用C可以实现面向对象编程!!!!
作者: yuanchengjun    时间: 2008-05-21 09:31
原帖由 openq 于 2008-5-21 09:08 发表
只要你了解面向对象的几个要点,就不会说用C可以实现面向对象编程!!!!


你说的那个不明白不要紧,
但是你要明白,如果面向对象了,如果变得繁琐甚至不能解决问题,那就真的没用了,
人家做了面向对象编译器,你喊好,
作者: enjoyo    时间: 2008-05-21 09:32
面向对象是一种思想,不是一种技术
作者: converse    时间: 2008-05-21 09:36
标题: 回复 #34 redor 的帖子
无语,怎么又把问题往语言好坏上面提...

作者: BoUer    时间: 2008-05-21 10:37
原帖由 doctorjxd 于 2008-5-20 10:07 发表
《Inside C++ Object Model》是我喜爱的一本书,也推荐给大家。

可惜翻译的很有争议
作者: chrisyan    时间: 2008-05-21 10:39
C++标准库都卖了有点可惜,这个东西是用来查的啊
作者: zhujiang73    时间: 2008-05-21 15:41
原帖由 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;    ...


加上成员函数:

#include <stdio.h>

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

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


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

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

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

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

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

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

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

void  B_init(B *pb, BC *pbc)
{
    pb->p = (void*)pbc;
}

int main (int argc, char *argv[])
{
    BC  bc;
   
    B   b1, b2;
    B   *pb1, *pb2;   

    pb1 = &b1;
    pb2 = &b2;

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


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

    ((AC*)(pb2->p))->set_ma((void*)pb2, 100);
   
    ((BC*)(pb1->p))->set_mb((void*)pb1, 20);

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

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

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


    return  0;
}

作者: chzht001    时间: 2008-05-21 15:49
原帖由 ypxing 于 2008-5-19 17:23 发表
最理解面向对象的是习惯于使用面向对象方法建模的人,虽然他们并不见得会使用面向对象语言
最不理解面向对象的是计算机,

面向对象语言只是将面向对象建模者的思想转换为计算机能认识的01

我认为,建模方 ...


有道理,其实面象对象是一种思维方式,如果没有这种概念,那么也有可能用面向对象的语言写出非面象对象的程序,或者不完全的面象对象的程序,呵呵, 讨论过很多年的问题了

[ 本帖最后由 chzht001 于 2008-5-21 15:52 编辑 ]
作者: eftp    时间: 2008-05-21 16:18
to  #43 楼:

你这是在学C++,不要被C++的不良思想束缚,建议逐渐放弃C++。

[ 本帖最后由 eftp 于 2008-5-21 16:25 编辑 ]
作者: UnixStudier    时间: 2008-05-21 17:01
c++滴不会,飘过
作者: eftp    时间: 2008-05-21 17:06
我没研究过 GObject , 搜了一些资料看了一下, 大概是C++思想的C语言的再现,没什么创意,价值不大。

一家之言。
作者: dianlongliu    时间: 2008-05-21 20:31
原帖由 flw 于 2008-5-19 17:00 发表
初学 OO 的话,还是从一个支持 OO 语法的语言开始吧。
当然,并不是说 C 就不可以 OO,
而是说,
无论是梁羽生笔下吕四娘的飞花摘叶皆可伤人,还是金庸笔下令狐冲的无招胜有招,
都是指融会贯通之后的一种上 ...


太有才了,
赞一个,还是应该脚踏实地,如履薄冰
作者: zhujiang73    时间: 2008-05-21 22:03
原帖由 eftp 于 2008-5-21 17:06 发表
我没研究过 GObject , 搜了一些资料看了一下, 大概是C++思想的C语言的再现,没什么创意,价值不大。

一家之言。



GObject 是 GNOME 的基石,GNOME 的成功大家都看得见。
作者: ssafa    时间: 2008-05-22 09:44
面向对象是思想,C++是一种程序语言,一种工具而已
作者: a1406    时间: 2008-05-22 10:33
楼主有偷换概念之嫌
应该是
理解了 C 的面向对象,也就理解了 面向对象, 而不是理解了C++
因为C++不全等于 面向对象
作者: Crimsoncn    时间: 2008-05-22 12:45
OO是为让开发更接近于对事物的描述,应该更容易理解吧!
C++的所有特性不都是用C是实现的吗?函数指针啦,回调啦,更为抽象而已,不适合敏捷开发,适合底层构架
作者: flw    时间: 2008-05-22 12:47
OO 吹嘘 OO 更适合描述 real world,吹嘘了几十年,大家居然认为 real world 就真的成 OO 的了。
作者: reiase    时间: 2008-05-22 12:53
原帖由 openq 于 2008-5-21 09:08 发表
只要你了解面向对象的几个要点,就不会说用C可以实现面向对象编程!!!!

那就说说什么是OO的要点吧
作者: lost_alien    时间: 2008-05-22 13:41
原帖由 flw 于 2008-5-22 12:47 发表
OO 吹嘘 OO 更适合描述 real world,吹嘘了几十年,大家居然认为 real world 就真的成 OO 的了。


那除了oo还有什么思想更适合描述real world吗 ?给个相关资料链接也好,我只是想了解一下
作者: reiase    时间: 2008-05-22 14:06
原帖由 lost_alien 于 2008-5-22 13:41 发表


那除了oo还有什么思想更适合描述real world吗 ?给个相关资料链接也好,我只是想了解一下

数理逻辑阿
有限状态自动机,都是有根据的

OO思想有什么出处没,数学,哲学,社会学什么的,机械学也算。
作者: augustusqing    时间: 2008-05-22 14:48
原帖由 ypxing 于 2008-5-19 17:15 发表
与面向过程相比,
面向对象提供了另外一种对现实问题建模的方法

面向对象语言只是对这种建模方式的支持

使用者(编程者)并不关心你的面向对象语言是怎么来的,
只关心该语言能不能提供面向对象建模时所 ...


赞同。

做正确的事,正确的做事。
作者: open_sky    时间: 2008-05-22 15:18
oo是概念
作者: open_sky    时间: 2008-05-22 15:19
不对,OO实一种机制
作者: jigloo    时间: 2008-05-22 15:22
靠,OO是一种成熟软件开发方法而已。
作者: robin10    时间: 2008-05-23 02:10
你们都错了!事实上,OO是2个O而已!

呵呵,开玩笑的,飘走。。。。
作者: lipingtababa    时间: 2008-05-23 08:40
国家税务总局前些日子发文:现在吹牛要上税了,各位注意
作者: a1406    时间: 2008-05-23 12:16
原帖由 reiase 于 2008-5-22 14:06 发表

数理逻辑阿
有限状态自动机,都是有根据的

OO思想有什么出处没,数学,哲学,社会学什么的,机械学也算。



数理逻辑不懂
但是觉得有限状态自动机也只是oo的一种应用而已
作者: open_sky    时间: 2008-05-23 12:36
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

作者: www.netbor.net    时间: 2008-05-23 13:04
原帖由 zhujiang73 于 2008-5-19 16:49 发表
我想,理解了 C 的面向对象,也就理解了 C++ 。其实基本原理是一样的,只是 C++ 把一些工作自动化了。 最近在学 Gtk 中的对象系统 GObject ,顺便对比了一下 CU 中出了名的 oioic ,看来 oioic 的作者有一定水平 ...

做什么出格的事?
作者: abncat    时间: 2008-05-23 13:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: langue    时间: 2008-05-23 13:41
我想,理解了“Chinglish”的语法,也就理解了 English
作者: www.netbor.net    时间: 2008-05-23 17:01
不知道我的说法对不对,我总认为学不好汇编的人,C/C++学得也不见得能好到哪里去。
作者: ypxing    时间: 2008-05-23 17:10
这样的话,
不是学习者的失败,就是C/C++发明者的失败

原帖由 www.netbor.net 于 2008-5-23 17:01 发表
不知道我的说法对不对,我总认为学不好汇编的人,C/C++学得也不见得能好到哪里去。

作者: suby    时间: 2008-05-23 18:14
还是多关注实际项目功能需求比较好,过于拘泥于语言特性反而会迷失方向
作者: jigloo    时间: 2008-05-23 18:23
恩,顶楼上。我本科时没人指点,鬼迷心窍,尽搞些旁门左道,现在后悔得不得了。
作者: zhujiang73    时间: 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;
}

作者: langue    时间: 2008-05-24 08:53
原帖由 suby 于 2008-5-23 18:14 发表
还是多关注实际项目功能需求比较好,过于拘泥于语言特性反而会迷失方向


大实话,语言特性本身也是跟着实际应用跑的
作者: 玩你不是两三天    时间: 2008-05-24 13:29
原帖由 lipingtababa 于 2008-5-23 08:40 发表
国家税务总局前些日子发文:现在吹牛要上税了,各位注意


的确要上税了。不然就没有边了。
作者: reesun    时间: 2008-05-24 17:48
标题: 回复 #1 zhujiang73 的帖子
C++确实与C有很多共同点,但是面向对象并不止如此。有机会你可以看看UML,它是怎么实现一个项目的,我个人认为UML还算在面向对象方面的典型。
作者: luren04    时间: 2008-05-27 22:11
向各位前辈学习了。
作者: fish-fly    时间: 2008-05-27 23:18
我来学习的
作者: unix_cn_2008    时间: 2008-05-30 01:11
个人认为C不用搞什么OO,有意义么?
作者: shihyu    时间: 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 放最前面 才能模擬繼承 是嗎?

謝謝
作者: zhujiang73    时间: 2008-06-04 17:08
原帖由 shihyu 于 2008-6-4 14:21 发表

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

...


是,一定要把 parent 放最前面。
作者: ew3j    时间: 2008-06-04 18:39
原帖由 zhujiang73 于 2008-6-4 17:08 发表


是,一定要把 parent 放最前面。


快别费进了, OIOIC怎么样了? 讨论讨论...
作者: zhujiang73    时间: 2008-06-04 20:50
原帖由 ew3j 于 2008-6-4 18:39 发表


快别费进了, OIOIC怎么样了? 讨论讨论...



有些驱动程序模型中有类似架构。
作者: ew3j    时间: 2008-06-04 20:56
原帖由 zhujiang73 于 2008-6-4 20:50 发表



有些驱动程序模型中有类似架构。


什么驱动? 类似什么家够, 类似OIOIC的?
作者: abcf    时间: 2008-06-05 11:49
什么是OIOIC呀? 没听说.
作者: geba168    时间: 2008-06-05 12:09
最早的C++编译器 就是先翻译成C  再编译的
作者: zhujiang73    时间: 2008-06-05 13:27
原帖由 ew3j 于 2008-6-4 20:56 发表


什么驱动? 类似什么家够, 类似OIOIC的?


驱动程序要有几个标准接口,类似  open(打开)、close(关闭)、read(读)、write(写)和 ioctl(输入输出控制),不同的驱动有不同的功能但接口相同,这样操作系统才能统一管理。至于多继承,比如说:我们有一个录音设备的驱动,和一个放音设备的驱动,现在要写一个声卡驱动,声卡上有录音设备和放音设备,就需要用多继承。处理多继承是比较麻烦,需要计算继承中不同部分的地址偏移,大概是用一个表纪录下不同亲类的大小和在子类中的位置,需要访问时计算指针的偏移量找到继承来的成员。
作者: ew3j    时间: 2008-06-05 14:04
原帖由 zhujiang73 于 2008-6-5 13:27 发表


驱动程序要有几个标准接口,类似  open(打开)、close(关闭)、read(读)、write(写)和 ioctl(输入输出控制),不同的驱动有不同的功能但接口相同,这样操作系统才能统一管理。至于多继承,比如说:我 ...


这是unix的一切都文件的思想, 支持多重继承么? 与OIOIC区别大去了, 它5个接口, OIOIC有9个接口, 而且实现机制也不同, 我猜的.
另外你说的移动指针应该让编译器做.
作者: zhujiang73    时间: 2008-06-05 14:52
原帖由 ew3j 于 2008-6-5 14:04 发表


这是unix的一切都文件的思想, 支持多重继承么? 与OIOIC区别大去了, 它5个接口, OIOIC有9个接口, 而且实现机制也不同, 我猜的.
另外你说的移动指针应该让编译器做.



多重继承,统一接口。一切都文件的思想,和一切都 OIOIC 的思想,5个接口和9个接口, 我看差不多。unix 要求驱动有统一的接口,但是驱动程序中可以有自己的继承机制。 如果需要多重继承,可以写一组函数来处理类型信息注册和指针位置计算,我看 OIOIC 中的处理也是类似方法。
作者: ew3j    时间: 2008-06-05 15:00
原帖由 zhujiang73 于 2008-6-5 14:52 发表



多重继承,统一接口。一切都文件的思想,和一切都 OIOIC 的思想,5个接口和9个接口, 我看差不多。unix 要求驱动有统一的接口,但是驱动程序中可以有自己的继承机制。 如果需要多重继承,可以写一组函数来 ...



你怎么知道差不多? unix那个有源代码么?
unix那个不支持多重继承? 还要在让程序员自己在外面实现?
作者: ew3j    时间: 2008-06-05 15:04
unix那个和OIOIC比较, 每个接口的参数个数和类型都完全不一样, 区别太大了.
作者: ew3j    时间: 2008-06-05 15:10
多重继承很难的, 不是你说的简单一个数组和指针就能实现的 。。。。。。。。。。。。。。。
作者: zhujiang73    时间: 2008-06-05 15:26
原帖由 ew3j 于 2008-6-5 15:00 发表



你怎么知道差不多? unix那个有源代码么?
unix那个不支持多重继承? 还要在让程序员自己在外面实现?



     应该是程序员自己先实现一组类型信息管理,和指针计算函数,然后调用它们。我看 OIOIC 中的多重继承是类似工作。
作者: ew3j    时间: 2008-06-05 17:02
原帖由 zhujiang73 于 2008-6-5 15:26 发表



     应该是程序员自己先实现一组类型信息管理,和指针计算函数,然后调用它们。我看 OIOIC 中的多重继承是类似工作。



那些工作OIOIC都已经做好了, 程序员只管用就是了. linux或unix 没有象OIOIC那样做,  它们需要程序员自己做, 有那个程序员愿意去做呢.
作者: zhujiang73    时间: 2008-06-05 19:51
原帖由 ew3j 于 2008-6-5 17:02 发表



那些工作OIOIC都已经做好了, 程序员只管用就是了. linux或unix 没有象OIOIC那样做,  它们需要程序员自己做, 有那个程序员愿意去做呢.


      只是开始时需要写一组纪录类型信息的数据结构,和一组处理类型信息的函数,以后就简单了。很多 C 语言的大牛就是喜欢自己写函数库,用别人的不
爽。   我认为  OIOIC  对这类程序有一定参考意义。在一般的应用程序中,通常需要定义任意类型,任意名称的成员函数,这个 OIOIC 能解决吗?
作者: ew3j    时间: 2008-06-05 20:11
原帖由 zhujiang73 于 2008-6-5 19:51 发表


      只是开始时需要写一组纪录类型信息的数据结构,和一组处理类型信息的函数,以后就简单了。很多 C 语言的大牛就是喜欢自己写函数库,用别人的不
爽。   我认为  OIOIC  对这类程序有一定参考 ...


你可能没看这个的#95楼,我看了这个才知道作者为什么把所有函数统一于9个接口:
http://topic.csdn.net/u/20080530 ... 7-8ade54b01d0c.html
作者: ew3j    时间: 2008-06-05 20:41
我认为,自己随便定义接口,整个软件世界还是混乱的,都统一于一致的接口是必然的。
作者: zhujiang73    时间: 2008-06-05 20:54
原帖由 ew3j 于 2008-6-5 20:11 发表


你可能没看这个的#95楼,我看了这个才知道作者为什么把所有函数统一于9个接口:
http://topic.csdn.net/u/20080530 ... 7-8ade54b01d0c.html


写远程调用时,我只用同一个接口函数和许多对象通信,就是用功能号和分枝实现的。不过处理一组功能号比处理一组函数名工作量大。
作者: ew3j    时间: 2008-06-05 21:02
原帖由 zhujiang73 于 2008-6-5 20:54 发表


写远程调用时,我只用同一个接口函数和许多对象通信,就是用功能号和分枝实现的。不过处理一组功能号比处理一组函数名工作量大。


你是说编码工作量大?
实际都一样的,只是以前用多个函数习惯了,乍一改方式不太适应,我想新的方式会更顺手,因为我们抓住了规律。
另外,最主要的是需要考虑对象的可维护可扩展性。
作者: zhujiang73    时间: 2008-06-05 21:17
原帖由 ew3j 于 2008-6-5 21:02 发表


你是说编码工作量大?
实际都一样的,只是以前用多个函数习惯了,乍一改方式不太适应,我想新的方式会更顺手,因为我们抓住了规律。
另外,最主要的是需要考虑对象的可维护可扩展性。


功能号适合机器处理,但函数名更符合人类习惯。   如果需要可以写一个接口包装函数,做中间转换工作,对象可以只显露这一个接口函数。我只用一个接口函数就行,不用 9  个,不是更好吗。
作者: ew3j    时间: 2008-06-05 21:46
原帖由 zhujiang73 于 2008-6-5 21:17 发表


功能号适合机器处理,但函数名更符合人类习惯。   如果需要可以写一个接口包装函数,做中间转换工作,对象可以只显露这一个接口函数。我只用一个接口函数就行,不用 9  个,不是更好吗。



功能号和函数名都一样符合人类习惯, 但有了放心的接口, 你会放心的去实现接口. 统一接口为任意对象间能自由通讯提供了保证.
中间转换工作对程序员的OO思想培养没有好处, 因为对象是复杂多变的, OO思想不是机械的.
只用一个接口不行, 会影响执行效率. 有的交互行为不需要那么多参数.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2