免费注册 查看新帖 |

Chinaunix

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

[C++] 确认一下c++中不能使用interface(如java)那样的功能把 [复制链接]

论坛徽章:
0
331 [报告]
发表于 2009-03-27 21:21 |只看该作者
原帖由 OwnWaterloo 于 2009-3-27 21:13 发表



这是弃C语言静态类型优势,  向动态类型语言靠拢。


没有任何一个C程序员坚持认为C是静态类型语言,不能舍弃静态类型优势。
Cpper们把静态类型优势给专利了,俺们交不起专利费

论坛徽章:
0
332 [报告]
发表于 2009-03-27 21:33 |只看该作者
原帖由 OwnWaterloo 于 2009-3-27 21:13 发表


不, 目前c++编译对non-virtual member function的流行的实现方式中,对象是不带函数指针的。
也就是说, non-virtual member function没有任何额外开销。
这点上, c++编译器是占优势的。


目前c++编 ...

我说的c实现OO中方法多态当然是指C++中的虚函数,如果不是虚函数,C中自然不用使用函数指针。
至于你说的C实现OO多态的方法需要使用函数指针数组导致大量void*。。。。
我就举个实际例子吧。
比如说VFS的设计,一个文件通常的操作有read(),write(),open(),close()...。
不同文件系统提供给上层的接口是一致的。
int read(int fd, char* buff, int count);
int write(int fd, char* buff, int count);
int open(char* path, int mode);
int close(int fd);

那么VFS就可以定义一个函数指针结构(不是数组)。
struct file_ops {
  int (*read)(int fd, char* buff, int count);
  int (*write)(int fd, char* buff, nt count);
  int (*open)(char* path, nt mode);
  int (*close)(int fd);
};

然后具体的文件系统就可以自己定义函数。
比如NFS文件系统可以使用
struct fle_ops nfs_file_ops = {.read = nfs_read, .write = nfs_wrte....}
FAT32文件系统可以使用
struct file_ops fat32_ops = {.read = fat32_read ....}

你可以看到,这里不存在void*的问题。

论坛徽章:
0
333 [报告]
发表于 2009-03-27 21:34 |只看该作者

回复 #332 OwnWaterloo 的帖子

类的实现继承, 通常是一种不好的设计, 所以我就没举这个例子。
但是,  上面用C实现多态,  真的算自然么?


我上面实现的多态够不够自然?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
334 [报告]
发表于 2009-03-27 21:38 |只看该作者
原帖由 reiase 于 2009-3-27 21:21 发表
没有任何一个C程序员坚持认为C是静态类型语言,不能舍弃静态类型优势。


那就约等于放弃了C程序员引以为豪的效率咯?
所以, 在说用C实现OO的时候,  请稍微提及这些方面。 否则就有误导人的嫌疑了。



当然, C++完全追求效率, 在运行时几乎不带有用的类型信息 ……
有时候也是 ……  有点麻烦的事情 ……
而且, 就如你说的, 得不到运行时优化……

[ 本帖最后由 OwnWaterloo 于 2009-3-27 21:40 编辑 ]

论坛徽章:
0
335 [报告]
发表于 2009-03-27 21:39 |只看该作者
2. 时空效率不如当前c++编译器采用的,流行的实现方式。

对member function, 采用的是one function one slot的方式。

struct Class {
size_t size;
void * (* ctor) (void * self, va_list * app);
void * (* dtor) (void * self);
void * (* clone) (const void * self);
int (* differ) (const void * self, const void * b);
};

一个对象有多少成员函数, 就有至少有多少个函数指针。


说穿了还不是在编译器上实现,静态关联.
如果我这样呢:


int  class_function_x ( void * self, void * b);

struct Class {

};


这样难道就不是OO么?C++本质上不就是这样处理非虚函数么?OO非要a.b()就叫OO么?
如果这样,Window NT内核难道不是OO设计的例子,Window NT内核里提供的对象怎么没见到C++的影子呢?

[ 本帖最后由 yovn 于 2009-3-27 21:49 编辑 ]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
336 [报告]
发表于 2009-03-27 21:42 |只看该作者
原帖由 yhb04 于 2009-3-27 21:33 发表
我就举个实际例子吧。


嗯, 确实不需要数组, 是我想错了


我把这个例子补充完整一点 :

struct file_ops {
  int (*read)(int fd, char* buff, int count);
  int (*write)(int fd, char* buff, nt count);
  int (*open)(char* path, nt mode);
  int (*close)(int fd);
};

struct file {
  int fd;
  struct file_ops* op;
};

int read(struct file* f, char* buff, int count ) {
  return (*f->op->read)(f->fd, buff, count);
}

这样, 对吗?


嗯 ……  op->read , op->write 应该也是常数时间寻址的, 因为编译器知道offset ……
我从汇编代码看到 eax+4, eax+8, ...  就想到数组去了 ……  狭隘了。

确实很自然

受教了,  谢谢 ~~~



原帖由 yhb04 于 2009-3-27 21:33 发表
你可以看到,这里不存在void*的问题。


关于这个我还想请教一下。
本来想不出例子的,  正好有人提供了素材 :

原帖由 yovn 于 2009-3-27 21:39 发表
如果这样,Window NT内核难道不是OO设计的例子,Window NT内核里提供的对象怎么没见到C++的影子呢?


我不知道他指的内核是什么。   但是, windowsNt内核里提供的对象, 就是windows内核对象的意思吧?
Process, Thread, Mutex 这些东西?

先不管它们算不算OO。

HANDLE h1 = CreateProcess( ... );
HANLDE h2 = (HANDLE) _beginthreadex( ... );
HANDLE h3 = CreateMutex( ... );

这里就会发生类型信息丢失。

以至于:
ReleaseMutex(h1); 这种错误, 只有在运行时(而非编译时), 才能暴露出来。

[ 本帖最后由 OwnWaterloo 于 2009-3-27 22:07 编辑 ]

论坛徽章:
0
337 [报告]
发表于 2009-03-27 21:43 |只看该作者
原帖由 OwnWaterloo 于 2009-3-27 11:02 发表


好像都搜不到他的帖子了 ……   是哪一届的学长???

想想还是算了吧,虽然你们精神状态很相似,但事情还是要看缘分滴

只是没想到丫居然还是版主,貌似已经n久没发帖了

论坛徽章:
0
338 [报告]
发表于 2009-03-27 21:43 |只看该作者
原帖由 OwnWaterloo 于 2009-3-27 21:38 发表


那就约等于放弃了C程序员引以为豪的效率咯?
所以, 在说用C实现OO的时候,  请稍微提及这些方面。 否则就有误导人的嫌疑了。



当然, C++完全追求效率, 在运行时几乎不带有用的类型信息 ……
有时 ...

还是那句话,C实现OO方法多态的运行效率不比C++差。

论坛徽章:
0
339 [报告]
发表于 2009-03-27 21:50 |只看该作者
原帖由 OwnWaterloo 于 2009-3-27 21:38 发表


那就约等于放弃了C程序员引以为豪的效率咯?
所以, 在说用C实现OO的时候,  请稍微提及这些方面。 否则就有误导人的嫌疑了。



当然, C++完全追求效率, 在运行时几乎不带有用的类型信息 ……
有时 ...


没觉的C语言以XXX为毫的,是谁说的,站出来
如果以效率为毫,当年Unix就拿汇编写了,也就没有C语言了

我记得以前在CU上火爆的OIOIC用宏在C下实现了多继承 所以你要说C写OO程序没效率俺可不能同意 你去查查,当年那贴貌似比这个还火

论坛徽章:
0
340 [报告]
发表于 2009-03-27 21:52 |只看该作者
我倒觉得现在让我写C的OO代码的话,我宁可用xml来提供运行时类型信息
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP