关于规定那点事——喷子不是想当就能当的

小郭一号 发布于 2012/09/23 16:35
阅读 546
收藏 1

http://www.oschina.net/question/127301_71215

一个语言引入新特性肯定会出问题,拿运算符重载来说,定义两个函数

double max(double a, double b)和float max(float a, float b),在某个函数中调用max(1, 2),这时候调用哪个?

三种处理方式:1.调用max(1, 2)编译不过,C++这样处理。2.禁止运算符重载,定义两个重名函数编译不过,C这样处理。3.死规定调用double版本或者float版本之一,c#这样处理。

++i + ++i表达式,在c/c++中给未定义行为警告,java中规定了运算顺序。

语言歧义的东西多了,你说哪个合理?都合理,都可以自圆其说,只要和期望的结果一致即可,语言自洽个JB!

C++里面你不看Base类源代码,在Derive类调用Base::fun(),你有什么办法判断他是静态还是非静态?没有办法。PHP也有这个问题,java的处理方式是静态就是::,非静态就是.,不会存在歧义,php处理方式是规定:这个时候就调用__call而不是__callstatic,懂什么叫规定不?就是王八的屁股,龟头的背面。这样规定能够合理的解决歧义问题,大家都遵守就是了。公司对歧义的地方也有规定,你非得来个凭什么这样而不那样,就送你俩字:滚蛋。

第二个问题:

引用这货的话:最后强调一遍,单根继承的意义是“一个子类只允许一个父类”。

我勒个去,连单根继承的作用是什么都不知道,谁告诉你单根继承只允许一个父类?Qt和MFC那么大的基于单根的库让你无视了?凭什么支持多重继承就不能支持单根继承?

做一个合格喷子的示范

全世界的人,包括动物,都知道近亲结婚可能会生有病的小孩,因为两份同样的隐性基因组合会出问题,后代会生病。猪狗之类未必知道道理,但是他们知道应该避免近亲结婚。而C++语言完全无视自然法则,以比猪还牛逼的智商支持菱形继承,并且为了消除相同基因(属性/方法)带来的问题,发明了vitual关键字引入新杂交技术。C++为啥这么复杂?就是因为加一大堆完全不必要的功能,带来一大堆问题,为了解决这一大堆问题又引入新的概念,而这些东西都是可以直接去掉的。

示范做完了,总结一下:不是谁想喷就喷的,弱智分子也不是想装就能装的高明的!

加载中
0
姑妄听之
姑妄听之
不了解楼主激动的前因后果,不过有些观点说得不错。帮顶一个。
小郭一号
小郭一号
看看开头那个帖子就知道了。那个家伙说的也有点道理,错就错在喷规定上。规定本身就是约定俗成的东西,只要遵守就行了,至于为什么,那就是王八的屁股,没有为什么 @唐明星
0
宏哥
宏哥

经得起时间考验的, 都是些简单的东西
简单不简单
0
放牛娃1988
放牛娃1988

呵呵,哪个帖子不敢去,在这里爆粗口就能扭转是非了?

1)运算符重载有明确的规定,什么优先,什么不优先有明确约定,但是parent::方法没有明确规定,所以有语法分歧,换句话来说,楼主不懂PHP,别来丢人,谢谢。

2)单根继承:大家都说java是单根继承语言,但从来没人说C++是单根继承语言。当然,你用C++的时候可以约定不是用多个类来继承,比如QT,但是不代表C++是单根继承语言。这就好比你在美国,也可以只生一个,甚至号召大家都生一个好,但是你不能说“美国在实行计划生育”。正如你自己二,不能说大家都二一样。

不服气的话,可以去OSC发一个帖子嘛,问一下C++是不是单根继承语言。

最最关键的,楼主被我点名为烂程序员而心生不满。你好好反省下,我什么说你是个烂程序员,因为你到现在还跟@宏哥 一样看不懂短短的 10行代码,却大发厥词,高谈阔论。我真心觉得恶心,所以让我由衷地对楼主说一句:You suck, 2 thing!

不理解前因后果的浏览此贴:http://www.oschina.net/question/127301_71215

小郭一号
小郭一号
呵呵个JB,不敢去?我开大喇叭骂你你居然说我不敢?
0
johnzhang68
johnzhang68

引用来自“唐明星”的答案

呵呵,哪个帖子不敢去,在这里爆粗口就能扭转是非了?

1)运算符重载有明确的规定,什么优先,什么不优先有明确约定,但是parent::方法没有明确规定,所以有语法分歧,换句话来说,楼主不懂PHP,别来丢人,谢谢。

2)单根继承:大家都说java是单根继承语言,但从来没人说C++是单根继承语言。当然,你用C++的时候可以约定不是用多个类来继承,比如QT,但是不代表C++是单根继承语言。这就好比你在美国,也可以只生一个,甚至号召大家都生一个好,但是你不能说“美国在实行计划生育”。正如你自己二,不能说大家都二一样。

不服气的话,可以去OSC发一个帖子嘛,问一下C++是不是单根继承语言。

最最关键的,楼主被我点名为烂程序员而心生不满。你好好反省下,我什么说你是个烂程序员,因为你到现在还跟@宏哥 一样看不懂短短的 10行代码,却大发厥词,高谈阔论。我真心觉得恶心,所以让我由衷地对楼主说一句:You suck, 2 thing!

不理解前因后果的浏览此贴:http://www.oschina.net/question/127301_71215

你那个帖子的题目本身就有问题。因为不合逻辑。中国的程序员也许多过1000万,应该只有不到50个人在你之前的帖子上回帖。即使所有回帖的人都很烂,从这50个人无论如何在逻辑上也推导不出你随后的帖子的结论。不论你是不是有科学或工程的背景,基本逻辑知识也应该是有的吧。即使你用不可靠的抽样的方法,你这样的样本也是完全不可靠的。


如果你想用“一个问题证明中国的程序员很烂” 这样的题目来哗众取宠,那也大可不必。

0
一千年前的人
一千年前的人

引用来自“唐明星”的答案

呵呵,哪个帖子不敢去,在这里爆粗口就能扭转是非了?

1)运算符重载有明确的规定,什么优先,什么不优先有明确约定,但是parent::方法没有明确规定,所以有语法分歧,换句话来说,楼主不懂PHP,别来丢人,谢谢。

2)单根继承:大家都说java是单根继承语言,但从来没人说C++是单根继承语言。当然,你用C++的时候可以约定不是用多个类来继承,比如QT,但是不代表C++是单根继承语言。这就好比你在美国,也可以只生一个,甚至号召大家都生一个好,但是你不能说“美国在实行计划生育”。正如你自己二,不能说大家都二一样。

不服气的话,可以去OSC发一个帖子嘛,问一下C++是不是单根继承语言。

最最关键的,楼主被我点名为烂程序员而心生不满。你好好反省下,我什么说你是个烂程序员,因为你到现在还跟@宏哥 一样看不懂短短的 10行代码,却大发厥词,高谈阔论。我真心觉得恶心,所以让我由衷地对楼主说一句:You suck, 2 thing!

不理解前因后果的浏览此贴:http://www.oschina.net/question/127301_71215

以前发过一个jdk的issue, 类似你这10行代码,我才2行,我觉得也没啥, 没有因此发现中国的什么问题。  http://www.oschina.net/question/173052_54084
0
小熊猫大暴走
小熊猫大暴走

一个语言引入新特性肯定会出问题,拿运算符重载来说,定义两个函数

double max(double a, double b)和float max(float a, float b),在某个函数中调用max(1, 2),这时候调用哪个?

三种处理方式:1.调用max(1, 2)编译不过,C++这样处理。2.禁止运算符重载,定义两个重名函数编译不过,C这样处理。3.死规定调用double版本或者float版本之一,c#这样处理。

------------------运算符重载???!!!

小熊猫大暴走
小熊猫大暴走
回复 @小郭一号 : 可是你说的不是运算符重载啊,文不达题
小郭一号
小郭一号
函数。运算符重载也有这个问题
0
新人王
新人王
楼主这个例子举得很好,支持一下
小郭一号
小郭一号
回复 @szf : 不光是不同版本,同一版本也有的。举例子,别信口雌黄
szf
szf
回复 @唐明星 : 呵呵,但我怎么觉得那是有点博人一喷呢~~~
放牛娃1988
放牛娃1988
回复 @szf : 不就是@宏哥 嘛,呵呵,本来那个帖子博人一笑,只是有的人纠缠不休,我怒了
szf
szf
回复 @小郭一号 : 不光是不同版本,同一版本也有的。 如果在语法层面有歧义的这个[现象]是算语言特性的话,我认为这就是这种语言的缺陷,只有深入理解此语言并发现这个缺陷,才能称为此语言的合格程序员。 至于某些人比较偏激,一副比较冲的样子,我也能理解,因为我见过比@唐明星 更偏激说话更难听的人,--当然,那人算是个大牛了,所以卖他面子的人多。
小郭一号
小郭一号
回复 @szf : 所谓不同版本出现问题只是个bug,如果这个bug没出现你会怎么想?
下一页
0
小郭一号
小郭一号

引用来自“唐明星”的答案

呵呵,哪个帖子不敢去,在这里爆粗口就能扭转是非了?

1)运算符重载有明确的规定,什么优先,什么不优先有明确约定,但是parent::方法没有明确规定,所以有语法分歧,换句话来说,楼主不懂PHP,别来丢人,谢谢。

2)单根继承:大家都说java是单根继承语言,但从来没人说C++是单根继承语言。当然,你用C++的时候可以约定不是用多个类来继承,比如QT,但是不代表C++是单根继承语言。这就好比你在美国,也可以只生一个,甚至号召大家都生一个好,但是你不能说“美国在实行计划生育”。正如你自己二,不能说大家都二一样。

不服气的话,可以去OSC发一个帖子嘛,问一下C++是不是单根继承语言。

最最关键的,楼主被我点名为烂程序员而心生不满。你好好反省下,我什么说你是个烂程序员,因为你到现在还跟@宏哥 一样看不懂短短的 10行代码,却大发厥词,高谈阔论。我真心觉得恶心,所以让我由衷地对楼主说一句:You suck, 2 thing!

不理解前因后果的浏览此贴:http://www.oschina.net/question/127301_71215

你的原话意思是:因为C++支持多重继承,所以C++不是单根语言,我批的是这个白痴逻辑,就好像美国不实行计划生育就不能生一个一样。

谁说没规定?现在的规定就是,非静态函数调用基类,优先当非静态处理,这样规定凭什么不行?

放牛娃1988
放牛娃1988
这个规定导致子类的非静态方法没法调用父类的静态方法,OK,这个规定当然行,你也可以规定中国人只允许白天睡觉,晚上工作,但是你自己不会觉得很操蛋呢?
0
放牛娃1988
放牛娃1988

楼主在我那个帖子里,他一味地说是我理解有误,甚至说PHP“这个规定是合理的”,注意,他说是“合理的”,“完全没有问题”,并且是“楼主不懂面向对象”,并且自吹自擂说“自己才对面向对象深入了解”......bala bala bala bala......我跟他反复解释了几遍,并且建议他多了解下PHP再来讨论,因为他自己说自己没接触过PHP,所以我并不怪他。他的回应是什么呢?粗口,就跟这个帖子一样,满屏的粗口。

这才是我愤怒的原因,也是我发帖的原因。

我那个帖子名字是“一个问题证明中国的程序员有多烂”,这个标题也是我一时激愤写的,可是看我的结尾,我说You suck的其实就是@小郭一号 。一个不知所云,却高谈阔论,自吹自擂,并且对我爆粗口的人,我的回应只能是“你真烂”。

回到楼主的这个问题,楼主举的例子十分地不恰当,我来帮楼主改一下:

1)这个叫函数重载,不是运算符重载。

2)函数重载,你说在不同的语言里有不同的处理方法,非常好,也就是说,在不同的语言里这个规定是清晰、合理且一致的,对不对?但是有一门语言,它引入了函数重载,但是却由于没有预知到函数重载可能导致的调用冲突,而对调用优先级不做规定,你会不会觉得很操蛋呢?

程序员们开始凌乱了,由于这门语言恰巧是动态语言,类型优先的通用原则失效,于是程序员们有的主张这样,有的主张那样,谁也说服不了谁,最后语言设计者跳出来:“吵什么吵,调用的顺序按照定义的顺序来”。OK,楼主期待的规定来了,赶紧执行吧,当然,这个规定到底合理不合理,天知道!最后发现,定义在后面的函数永远用不着了,哈哈!

这就是parent::调用所反映出来的问题,有的程序员主张调用静态,有的主张调用非静态,这两种规定随便捏,谁也不比谁合理些,而哪一种都会带来问题。最后没办法,规定“非静态语言调用父类的方法无法确定的,一律调用非静态”,这个规定直接导致子类的非静态方法无法使用静态方法,楼主却说”这个规定是非常合理的“,”你们对面向对象了解不深”,哈哈。

在回到单根继承的问题上来,我举这个例子,无非是那个人也说自己不懂PHP,说自己是C++程序员,那我就举个你熟悉的例子,就拿C++的多重继承来举例。

那么,楼主的意思是C++是单根继承语言?我在网上随便搜一下,发现结论如下:

在OOP中,自C++面世以来就已变得非常瞩目的一个问题就是,是否所有的类最终都继承自单一的基类。在Java中(事实上还包括除C++以外的所有OOP语言),答案是yes,这个终极基类的名字就是Object。事实证明,单根继承结构带来了很多好处。

人家明确说了“除C++以外的所有OOP语言”,为啥不包括C++呢?这得说清楚什么才叫“单根继承”。

单根继承的原则如下:

1)继承时,只允许有一个父类

2)所有的类,都源自同一个基类

C++有做这样的规定吗?明显没有,C++是多重继承语言,从来没规定过继承时只允许有一个父类,更没有规定过所有的类都源自同一个基类。那么C++不是单根继承语言不是明显的吗?

楼主,我知道你要说什么,C++确实不是单根继承语言,但是它可以实现单根继承啊,我不用多重继承,并且设定一个基类让它来继承不就完了?这是你自己对语言的改造罢了,你也可以约定我在C++当中只使用面向过程编程,不使用面向对象编程,然后说C++不是OOP语言吗?对语言的使用不改变语言本身的属性。就一门OOP语言来说,它要么是单根的,也就是禁止多重继承,要么允许多重继承,“禁止”和“允许”是明显对立互斥的两个概念,怎么能够既禁止,又允许呢?

换句话来说,一门OOP语言的设计者在设计之初都考虑过这个问题,对于多重继承,要么“禁止”,要么“允许”,我想强调的是不能既禁止又允许,就像parent::一样,本来是既能调用静态,又能调用非静态,可是到后来,却不知道调用哪个才好,发生了冲突。

楼主还在这个问题上纠缠不休,就实在无聊了。我从来没听说过C++是单根(继承)语言的说法,因为单根是禁止多重继承的,C++禁止了吗?没有。

小郭一号
小郭一号
楼主的意思是C++是单根继承语言==哪里?我的文章一直没修改,找出来
小郭一号
小郭一号
有的程序员主张调用静态,有的主张调用非静态==放屁。无论哪个主张都是不存在的
小郭一号
小郭一号
可是到后来,却不知道调用哪个才好==只有你自己不知道调用哪个,一开始PHP的意图就是调用非静态,只是出了个bug就JJYY
小郭一号
小郭一号
因为单根是禁止多重继承的==放屁
小郭一号
小郭一号
1.这个规定直接导致子类的非静态方法无法使用静态方法==放屁 2.你的逻辑是:因为C++支持多重继承,所以它不能单根继承,这个逻辑是错的
0
小郭一号
小郭一号

1.你意思是“这个规定直接导致子类的非静态方法无法使用静态方法”。典型的信口雌黄。就好像说:C语言规定用分号结束语句直接导致我不能用句号一样。C#处理max(1, 2)调用的是float版本,就直接导致不能调用double版本了?只能说你白痴,不会变通

2.我从来没有说过C++是单根语言,完全是你YY出来的,而你不能否认C++也能做到单根继承,就把注意力转移到这上面,YY出一个结论强加给我然后批判,跟抽自己嘴巴没什么区别。另外我完全可以设计一种既支持单根又支持多重继承的语言,就是麻烦点而已(事实上C++所有指针都能看做void *再强制转换,只是不安全。C++不支持单根的原因也不在于多重继承),你所谓“单根继承的原则如下:1)继承时,只允许有一个父类 ”也是毫无根据。@唐明星

一开始发成博文了,发现没人回复,打击很大,现在满足了我的喷人欲望和优越感,也非常感谢你

返回顶部
顶部