免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
261 [报告]
发表于 2009-03-27 10:51 |只看该作者
原帖由 nutcracker 于 2009-3-26 19:04 发表
C++的创始人根本就不怎么关心OO,所以才成为你说的四不像.



赤裸裸的污蔑!!!   你有任何证据吗?   否则就别在这里放屁!!!

C++的前身就是C with class。 他在C上增加的唯一东西就是对OO的支持

看看Bjarne Stroustrup是如何引导C++开发者做更好的OO设计
现代C++风格, http://www.royaloo.com/bjarne/interviews/bs_artima2.htm
里面就提到了如何在C++中使用interface, 以及interface的重要性。


template机制是在OO之后才加入C++的。
是否对范型的支持是不必要的????  是否因为有单根, 一切都是object, 就不再需要范型了????

绝对的错误观点。  否则java干嘛要加generic???
因为纯oo的开发范式,并不能很好的满足需要
是不是因为java加入了generic, 他也是四不像???


而后人关于template的成就, 大大超过Bjarne Stroustrup的预期。
functional,是因为STL之父的工作。
template metaprogramming, 也是后人利用template 实例化机制, 将其作为一种子语言使用。

这些都不足以说明 “C++的创始人根本就不怎么关心OO”。

原帖由 nutcracker 于 2009-3-26 19:04 发表
纯技术爱好者的末路可以参考孔乙己.


闭关, 固步自封者的末路可以参考清政府

原帖由 nutcracker 于 2009-3-26 19:04 发表
既然承认自己愤,就别打太极.你要么纯粹就是一个技术爱好者,不靠编程来养家糊口,要么就是在麻醉自己.


小样, 懒得理你还得意起来了。
同样, 你说话有证据吗?   满口胡言。



原帖由 nutcracker 于 2009-3-26 19:04 发表
OO的本质是思想而不是某种语言提供的特性


OO是思想, 不是语言提供的特性。
函数也是子过程的思想, 不是语言提供给你的特性。
操作特定cpu,也是思想, 不是语言提供给你的特性。

C提供给操作不同cpu的特性, 你是否使用C?
C提供给你函数的特性, 你是否使用函数?

语言是工具, 是表达思想的工具。
某种思想如果语言不提供支持, 表达起来就是憋足的。

原帖由 nutcracker 于 2009-3-26 19:04 发表
GNU项目中用C来实现面向对象的代码很多,就从这点看,你对技术的爱好恐怕还真是有限度的


我们就来看看谁是有限度的。

也请你拿出具体的证据来。 哪个gnu项目中, 用c实现了面向对象。
实现到了何种程度???

不要张口闭口就说oo,c也行,  误人子弟

试试把下面的c++代码翻译成c only???


struct I1 {
   virtual ~I1();
   virtual void f1() = 0;
   virtual void f2() = 0;
};

struct I2 : I1 {
   virtual ~I2();
   virtual void f3() = 0;
};

class C11 : public I1 {  };
class C12 : public I1 {  };
class C21 : public I2 {  };

注意, 这里仅仅使用c++的一个受限子集。 并没有出现实现继承, 和多继承。

C11* c11 = new C11;  // 为简单, 省略工厂类

I1* i1 = c11;  // 编译时检查, 正确的行为。

i1->f1();   // 多态。 典型时空效率:1个对象,一个虚表指针。1个类,一份虚表。 虚函数调用常数时间开销。


C12* c12 = new C12;
i1 = c12;  // 编译时检查正确的行为。

i1->f1();

C21* c21 = new C21;
i1 = c21;  // 编译时检查错误


尤其注意注释中的细节部分。


你真的用过c去表达oo思想吗??  还是人云亦云??

在我看来, 许多号称c表达oo的地方, 仅仅是c++的如下表达。
class c {
  struct Impl;
  Impl* impl_;
};
也就是, 仅仅是接口与实现的分离。根本没有多态

多态在c的设计中是否重要, 我不清楚。
但是, 接口与实现分离, 仅仅是接口与实现分离。 那只是oo的一部分, 不要说那是oo

原帖由 nutcracker 于 2009-3-26 19:04 发表
正是因为你说的,C++是万金油,所以啥编码风格都有,工程中四不像的代码比比皆是,别告诉我阅读和维护这

种代码也是一种享受.什么?你说你从来不用看别人的代码,程序都是自己从零写的?那你就尽情享受去吧.


关于这个, 我上面也说了, 要完成更多的任务, 语言不得不更加复杂。
java也是在越来越复杂, java也部分支持generic, 是否使用了generic的java代码也是四不像???

c++社区从来没有倡导你去使用c++的高级特性。
那不是给你这样的人用的。 不要因为你掌握不了, 就说他不好。

如果你掌握不了, 请使用陶瓷剪刀。
不要割到自己手了就在这里叫唤。

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

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
262 [报告]
发表于 2009-03-27 11:02 |只看该作者

回复 #260 艾斯尼勒 的帖子

1、前面说过很多次了,JVM和.net只是两个通用平台,或者你可以把它们看作两者新兴的轻量级虚拟操作系统。如此而已。

2、无论是C#还是Java还是C++,原则上都可以编译成这种新的轻量级虚拟操作系统上的代码——微软已经直接暴露了本质: 托管代码和仅包含托管代码的DLL。

3、既然都可以编译成这种新虚拟操作系统上的动态库,那么还有所谓的库、架构的区别吗?
之前,Java是借助JVM的封闭与垄断,禁止其他语言在二进制层面直接与它的支撑库交互。
一旦它开放了,看看GTK+,Linux上有几种语言不能与之交互?

微软已经用实际行动证明,即便是C++,在避开一些底层特性的情况下,也是可以编译成中间字节码的(即所谓的托管C++)。

这就好象Borland的C++ builder直接用了Delphi写的VCL库一样,既然有了二进制兼容的动态库,你以为cpper真的会“饿死不用Java库”吗?

C++的特点就是大而全,所以用户必须学会自己裁剪,自动避开那些并非非用不可的特性。

比如说,如果只是用stl容器的话,你完全可以把C++当Java来用——没有指针,没有弱类型,有不完全的垃圾收集(C++09后就有完全版的了)。
凭借这种可裁剪性,C/C++几乎可以和其他任何东西无缝结合——这也正是C/C++体系的威力所在。

说白了,Java的市场策略无非是: 利用封闭的JVM排斥其他语言,花大力气开发方便使用的库以吸引用户,然后在排斥了其他语言代码的情况下借助跨平台优势和丰富强大的库狂推Java。

.net则准确的击中了这种策略的软肋,逼JVM去接纳其他各种语言;而一旦JVM接纳了别的语言,Java已有的那些库也就自然而然像GTK那样开放了;这时候,哪怕是asp都可以是强悍的,可直接利用Java已有基础构架的。

没有什么通用语言是天生支持/不支持什么架构的。就好象python也可以轻松使用C写的GTK一样(哪怕GTK是一种“C写的面向对象图形库”)。



4、我认为你一直没有理解“开放”二字的含义。
开源不等于开放。允许其他体系在不损失性能的情况下、很方便很自然的交互才是开放。

所以,请摒弃Java灌输给你的错误观念——JVM和.net都不是语言。它们是平台。
所不同者,JVM是封闭的、仅支持Java的平台,而.net是通用平台。

换言之,Java是靠JVM的封闭优势和其他语言展开不公平竞争的;而精明的微软正是意识到了这一点,才用.net狠狠将了它一军,强迫JVM给其他语言平等竞争的权利。

JVM的开放,必将给Java带来前所未有的冲击——有人就喜欢asp,借助已有的Java库,asp很容易就能变得更强大,这就是对Java市场的侵蚀。
同样,使用托管C++就可以得到和Java几乎一样的便利,还可以随时“超点范围”,学学C++的底层东东,何乐而不为。这就是另一种冲击。

当然,微软的算盘打得很不错,实际能做到几分,只能靠事实来验证了。



5、关于.net的推广,只能说不能小看微软的手段。
况且,就连微软不喜欢的wine都有人自发搞出来了,Linux下搞个微软期望推广的.net支持,有那么难吗?


6、开源界不是不喜欢C++,而是不喜欢不问青红皂白的OO。
或者说,他们讨厌教材上那种死板的OO,讨厌死板的OO框架。

这里或许需要多解释两句。

首先是何谓OO?

OO是一种协议。这种协议规定了一套机制,这套机制可用来实现多态;具体机制可能有无数种,但不管具体如何做,只要能支持多态,这机制就是OO。

既然是协议,就一定会有实现。
所不同者,就是这个实现是什么样子、使用什么机制。

所有的OO语言,其实都是预设了自己的OO协议和OO机制;所不同者,只是这套协议允许不允许你抛弃或替换。
比如说,Java就不允许抛弃它的OO机制,不管需不需要;而C++则可自主选择。



开源界的那些牛人们又有一套看法。

对他们来说,用OO语言开发,无异于接手别人做了一半的、不开放源码的、仅实现了OO协议的一套烂摊子,然后再修修补补搞出自己的一套系统。
最糟糕的是,一旦换一个编译器,或者仅仅是用了同一个编译器的不同版本,烂摊子就可能轰然倒塌,或者是出现这样那样的问题。
同时,由于具体OO实现的问题,还要注意诸如自动类型转换、默认拷贝函数等等很多衍生细节。这都加大了项目复杂度,加大了项目失败的可能。

与其如此,不如他们自己动手,制定精确合乎自己需要的、每行代码都可见、每个行为都可以精确控制的OO协议,然后在这个协议之上开发精确可控的、可移植的系统。

这方面的典型例子,不妨看看GTK。看看它是如何在不使用任何诘屈聱牙的语法和/或hack手段的情况下,用C实现OO以及类型安全的。


事实上,开源界是提倡用C++编译器重新编译C代码的——强类型的C++太容易揭示某些隐藏错误了,STL也太好用了。这些都很好,笑纳。
至于它的OO……谁喜欢谁用好了(俺就是不成器的、不挑剔C++的OO部分的菜鸟之一)。

允许每个人根据需要裁剪功能,这也是C++的魅力所在。

[ 本帖最后由 shan_ghost 于 2009-3-27 11:03 编辑 ]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
263 [报告]
发表于 2009-03-27 11:02 |只看该作者
原帖由 小i 于 2009-3-27 02:34 发表
靠,爬了160楼,爬不动了。

同济大学的王鹏同学,你可以去找找安全版前斑竹(现在还是不是了我不太清楚哦)ayazero同学聊聊,感觉你们是同一个类型的。俗话说,物以类聚嘛


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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
264 [报告]
发表于 2009-03-27 11:05 |只看该作者
原帖由 shan_ghost 于 2009-3-26 18:01 发表
如果说,C/C++程序员的心智障碍是字斟句酌锱铢必较事事都要打破沙锅问到底的话,Java带给程序员的心智负担,或许就是封闭和狭隘

原帖由 shaohao 于 2009-3-26 21:00 发表
JAVA是阉割了的C++


不得不顶

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

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
265 [报告]
发表于 2009-03-27 11:15 |只看该作者
原帖由 reiase 于 2009-3-26 12:46 发表

你怎么确定你在Java里学到的思想少,Java的类库可是OO设计的典范之作阿
就像俺说的,C++作者在自己的书里拿数学,哲学,文学来装B。但如果你真的去读些这方面的书的话,要在这几方面鄙视他是很容易的。


Stack extends Vector; 确实是典范之作
还能有比这更典范的么

你可以鄙视他在数学、哲学、文学上装逼、 你也可以鄙视他的这些方面。
但是就计算机科学,  你, 还能够鄙视他吗?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
266 [报告]
发表于 2009-03-27 11:16 |只看该作者
原帖由 reiase 于 2009-3-26 12:50 发表


个人认为C++不可能真的functional,毕竟C++与functional的祖宗级语言Lisp站在静态与动态的两个极端上


函数式编程, 是否一定是动态语言才行?
还是因为有一个动态的Lisp, 所以先入为主的认为只有动态语言才能函数式编程?

请指教~~
我很明白的说, 我不懂lisp。
不会像某些人, 不懂装懂。

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

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


Stack extends Vector; 确实是典范之作
还能有比这更典范的么

你可以鄙视他在数学、哲学、文学上装逼、 你也可以鄙视他的这些方面。
但是就计算机科学,  你, 还能够鄙视他吗?


俺又不是学计算机的

[ 本帖最后由 reiase 于 2009-3-27 11:47 编辑 ]

论坛徽章:
0
268 [报告]
发表于 2009-03-27 11:33 |只看该作者
刚才搜 Stack extends Vector,
跳出篇 "正方体不能继承长方体" 的文章, 比你们讨论的话题有趣。

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


函数式编程, 是否一定是动态语言才行?
还是因为有一个动态的Lisp, 所以先入为主的认为只有动态语言才能函数式编程?

请指教, 我是真的不懂Lisp。


我也不怎么会Lisp,但还是打比方来说吧,见笑了。
OO特性里边的反射特性与元类特性,是不可能在编译时实现的,因此C++没有提供完整的支持(RTTI的反射特性不完整)。同样functional里有些特性也不是容易在编译是实现的,比如匿名函数,闭包等。

另外,对于你前边提到的一个脚本语言快于C++的笑话,我提个例子。
foo(x)这个函数,在函数式语言里,只要参数相同,返回值就一定固定。而在C++里边,有前边所讲的,函数返回值是状态相关的,因此,不能断定相同参数下,返回值就一定相同。所以对foo(foo(foo(...)))这种表达式,在函数式语言里,可以在编译时就求值,而C++里是万万不行的,所以某些函数式的脚本语言,是能够在特定应用场合下具有超越C\C++的性能的

我觉的你C++基础不错,但是目光有点窄,不然不会把话讲的那么死。你可以参考一下那几个混的成精的版主的态度,人家才是见过世面的

论坛徽章:
0
270 [报告]
发表于 2009-03-27 11:39 |只看该作者
比较语言某个特性,没多大意义。

但C++确实是在没落,这一点连C++之父都承认了。

做底层不如C,做应用不如JAVA。

C++目前也能守住图形处理领域。

开源、上层应用还是C、JAVA比较多。另外C#这个完全是抄袭JAVA,当然现在有点青出蓝的味道。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP