Digest

金庸高手排名



金庸高手排名

仙人级别:
1、达摩老祖: 我是神,不是人,毫无可比性……
2、扫地神僧: 我是楼上的化身,半神,免疫8号,33号绝技,一掌拍死16号,一眼看死15号.一摸又全救活……
3、独孤求败: 杨过小儿!只不过拿了我八剑中的一把,就已经那样了。。  
4、逍遥老祖: 吾乃逍遥派开山始祖,无崖子?北冥神功?见了我要叫师父……
5、东方不败: 你们知道吗,没有了性的束缚,练武功可以容易很多……

超一流高手级别:
6、虚竹: 4号,您还有徒弟没有被我吸过内力的吗,我还没吸够……
7、段誉: 我可能打不过某一个男人,但我绝对能征服每一个女人……
8、萧峰: 我是真男人,我的武功都是自己的,不是吸来的!
9、杨过: 如果我有两只手,我将会是第二名!7号你能征服的了我姑姑?
10、令狐冲: 沧海笑,滔滔两岸潮,盈盈笑我太疯癫,却不知何谓超凡脱俗.
11、王重阳: 有个问题,我重申一下,当年华山论剑其实我是1V4.并且24号是变身状态.
12、风清扬: 一个人不可不 ,更不可让来的东西束缚自己,大家听得懂不?慢慢琢磨,我隐居去了.

一流高手级别:
13、张无忌: 有人说我可爱,有人骂我窝囊,我只想说一句,我做君子,不做大丈夫.
14、郭靖: 有没有人跟我比赛直来直去的逻辑思维能力?
15、萧远山: 儿啊,把爹楼上的都干掉,他们欺负我们辽人!
16、慕容博: 儿啊,你稍许差劲了点吧!
17、周伯通: 我淡泊名利,我超然于宇外,我胸无半点尘埃,我只是怕女人……
18、张三丰: 太极那么高深的武功,也因为太过普及而被人们看扁,唉……
19、无崖子: 有的人活着他已经死了,有的人死了他还活着!
20、巫行云: 沧海妹妹,我们境界高一点不行吗…..
21、李秋水: 师兄,我和沧海一样美丽,还比她更温柔,我不好么……
22、小龙女: 过儿你在哪,这里好可怕,这些人都好恶心.
23、金轮法王: 老夫武艺天下无敌,来到这里心里好没底!
24、欧阳锋: 请问,哪里有正版的九阴真经啊……
25、洪七公: 萧峰始祖啊!你传下来的降龙十八掌是不是走了样了啊!
26、一灯: 我是7号的亲戚,我坚信.
27、黄药师: 为什么书老是要分上下部?看了一辈子九阴真经下,也猜不着上是啥…
28、鸠摩智: 小僧曾有幸一睹中原武艺,遂发誓终身不再练武……
29、段延庆: 我的生命中,曾有那么一缕春风,给我带来一个第七名的儿子,我已经没有遗憾了…
30、游坦之: 阿紫!我很丑可是我很痴情!老天眷顾我,原来是为了蹂躏我.
31、裘千仞: 要不是被裘千丈那孽畜坏我名声,我能这么低?
32、丁春秋: 没有我这么传统的反派,你们这些人又怎么爬上去!
33、慕容复: 复我大燕,舍我其谁,为前途,我忍痛,放弃爱情,却无处流泪.
34、成昆: 道高一尺,魔高一丈!我居然不是垫底!
35、袁承志: ….能排上我已经很满足了….

C++虚函数表解析(转)update

update: 今天花了一下午仔细看了这篇文章,却怎么也琢磨不透,因为当中的说法前后存在一些矛盾,后来脑子快崩溃的时候,做了一个大胆的假设: 也许里面有些地方说错了。

果然,当我回头看这篇文章下面的评论的时候,才知道,作者确实某些地方说错了。。。但是,回过头来评价这篇文章,真的是一绝的好文,堪称一绝是无可厚非的。

现在我将其中的错误作出相应的修改,以及矛盾的说明,并以红色字说明。

original:

C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。

关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家 一个清晰的剖析。

当然,相同的文章在网上也出现过一些了,但我总感觉这些文章不是很容易阅读,大段大段的代码,没有图片,没有详细的说明,没有比较,没有举一反三。不利于学习和阅读,所以这是我想写下这篇文章的原因。也希望大家多给我提意见。

言归正传,让我们一起进入虚函数的世界。

虚函数表

对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。 在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了 这个实例的内存中(应该更正为 一个类的虚函数表是静态的,也就是说对这个类的每个实例,他的虚函数表的是固定的,不会为每个实例生成一个相应的虚函数表。),所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。

这里我们着重看一下这张虚函数表。在C++的标准规格说明书中说到,编译器必需要保证虚函数表的指针(这里明明说对象实例的最前面的位置存的是虚函数表的指针,注意,不是虚函数表,而是指向虚函数表的指针,然后再看下面的例子上的代码)存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。 这意味着我们通过对象实例的地址得到这张虚函数表(这话没错,不过,通过对象实例的地址一次是取不到的,需要两次),然后就可以遍历其中函数指针,并调用相应的函数。

听我扯了那么多,我可以感觉出来你现在可能比以前更加晕头转向了。 没关系,下面就是实际的例子,相信聪明的你一看就明白了。

假设我们有这样的一个类:

class Base {

public:

virtual void f() { cout << “Base::f” << endl; }

virtual void g() { cout << “Base::g” << endl; }

virtual void h() { cout << “Base::h” << endl; }

};

按照上面的说法,我们可以通过Base的实例来得到虚函数表。 下面是实际例程:

typedef void(*Fun)(void);

Base b;

Fun pFun = NULL;

cout << “虚函数表地址:” << (int*)(&b) << endl;  //这只是对象实例的地址,而非虚函数表的地址,*(int*)(&b)才是指向虚函数表的指针,也就是虚函数表的地址,这与最前面的括号里面的注明相呼应。

cout << “虚函数表 — 第一个函数地址:” << (int*)*(int*)(&b) << endl;  //而这个才是虚函数表的地址,虚函数表的第一个函数地址(函数指针)应该是*(int*)*(int*)(&b),这样下面的函数指针赋值才说得通:pFun = (Fun)*((int*)*(int*)(&b)); ,不然下面的“

(Fun)*((int*)*(int*)(&b)+0); // Base::f()

(Fun)*((int*)*(int*)(&b)+1); // Base::g()

(Fun)*((int*)*(int*)(&b)+2); // Base::h()

的+0, +1, +2这样的函数指针偏移方式也说不通了。

// Invoke the first virtual function

pFun = (Fun)*((int*)*(int*)(&b));

pFun();

实际运行经果如下:(Windows XP+VS2003, Linux 2.6.22 + GCC 4.1.3)

虚函数表地址:0012FED4

虚函数表 — 第一个函数地址:0044F148

Base::f

通过这个示例,我们可以看到,我们可以通过强行把&b转成int *,取得虚函数表的地址,然后,再次取址就可以得到第一个虚函数的地址了,也就是Base::f(),这在上面的程序中得到了验证(把int* 强制转成了函数指针)。通过这个示例,我们就可以知道如果要调用Base::g()和Base::h(),其代码如下:

(Fun)*((int*)*(int*)(&b)+0); // Base::f()

(Fun)*((int*)*(int*)(&b)+1); // Base::g()

(Fun)*((int*)*(int*)(&b)+2); // Base::h()

这个时候你应该懂了吧。什么?还是有点晕。也是,这样的代码看着太乱了。没问题,让我画个图解释一下。如下所示:

注意:在上面这个图中,我在虚函数表的最后多加了一个结点,这是虚函数表的结束结点,就像字符串的结束符“\0”一样,其标志了虚函数表的结束。这个结束标志的值在不同的编译器下是不同的。在WinXP+VS2003下,这个值是NULL。而在Ubuntu 7.10 + Linux 2.6.22 + GCC 4.1.3下,这个值是如果1,表示还有下一个虚函数表,如果值是0,表示是最后一个虚函数表。

下面,我将分别说明“无覆盖”和“有覆盖”时的虚函数表的样子。没有覆盖父类的虚函数是毫无意义的。我之所以要讲述没有覆盖的情况,主要目的是为了给一个对比。在比较之下,我们可以更加清楚地知道其内部的具体实现。

一般继承(无虚函数覆盖)

下面,再让我们来看看继承时的虚函数表是什么样的。假设有如下所示的一个继承关系:

Read the rest of this entry »

中科院力学所怀柔试验基地被非法拆毁

我们以沉痛和愤怒的心情正式宣告,我所怀柔试验基地遭暴力拆毁,钱学森先生回国建立的首批实验室被夷为平地。

2010年7月17日上午,试验基地的保安人员被一伙不明身份人员控制,失去人身自由。在此期间,共计9处房屋被大型铲车与推土机夷为平地,一批重要的科研装置和设备被砸毁掩埋。2010年7月22日至23日,该试验基地再遭持续地肆意毁坏,钱学森先生回国初期指导研制的科研装备等大量历史性文物、国家973项目试验装备、国防重大科研任务的仪器装置和备件等以“垃圾”的名义被清除出场,值守该试验基地的工作人员深受刺激入院治疗。

该试验基地是钱学森先生回国后亲自选址和创建的,是我国第一个火箭研究与试验基地,为我国“两弹一星”做出了重大的历史性贡献。目前,该试验基地正承担着国家重大专项、国家重大基础研究发展计划项目等重大科研任务。此次试验基地被毁,初步统计的国有资产直接损失高达1700余万元。更加令人痛心的是,一批我国现代科技史上代表性的珍贵文物被肆无忌惮的捣毁和清运,一批国家级的重大科研任务被迫停滞。

在我国和谐、稳定、快速发展的大好局面下,在中国科学院这一神圣的科学殿堂,发生了如此野蛮的暴力事件,令人震惊!力学所参与试验基地建设和“两弹一星”攻关任务的院士和科学家们悲愤交加,全体科研人员极为愤慨。“炎夏似隆冬,白昼如夤夜”是我们此刻共同的感受。

事件发生后,我们已经在第一时间向中科院有关领导和部门进行了汇报,并向当地公安机关报案。我们要相信党、相信组织,让我们一起期待法律的公正判决!

请全体职工和学生克制情绪,保重身体,克服困难,团结起来,勤奋工作,以实实在在的科研工作报效祖国,告慰钱学森先生等的在天之灵!

中国科学院力学研究所

2010年7月23日

详见:http://www.imech.ac.cn/xwdt/tpxw/201007/t20100723_2909933.html

“新伊索寓言”

“新伊索寓言”

伊索寓言橡树和芦苇

一棵大橡树被大风连根拔起,飞到河那边,落到一片芦苇旁。橡树对芦苇说:”你们那么轻弱,我真不明白你们怎么会不被狂风彻底摧残呢?”芦苇回答说:”你和风抗争,最后你失败了。而我们正好相反,只要有一点点微风,我们就在它面前弯下腰来,因此就不会被折断,所以能避免摧残。”

芦苇正得意洋洋地说教着,一个农人走过来,发现了这棵橡树,如获至宝。农人家里准备打家具,这根橡木正合适。农人临走时还割倒了一片芦苇,农人家里也正缺少柴禾。过了几天,芦苇被送进灶膛时,忍不住又看了一下那棵橡树–橡树已被打造成一只柜子,这回芦苇不再多舌。

核桃树

路旁的核桃树结满了核桃。过路的行人为了把核桃打下来,用石头打它,用棍子敲它,把它的树枝都弄折了。核桃树不由地叹息道:”唉,我的命真苦啊!我用我的核桃给人们享用,而他们却给我这种痛苦做回报!”它的叹息给旁边的另一棵不结核桃的核桃树听到了,不结核桃的核桃树同情地说:”看来,你得学我的样,不结一颗核桃出来,那么,人们又怎能摧残你呢!”结核桃的核桃树想了想说:”到底我也有我的荣耀啊!人们走过我的身边,常常会对我发出赞叹,赞叹我的丰美,赞叹我的能耐。一旦不结果子了,我还能得到这些荣耀吗?再说,做一棵不结核桃的核桃树,还能算是核桃树么?”不结核桃的核桃树听了此话生气地说:”我好心好意地劝你,你倒要嘲笑我,你既要享受荣誉,那就只好受苦了!”

唱歌的人

有个人没有唱歌的天分,但很喜欢唱歌。平常他在家里对着墙壁,大唱特唱,声音在屋里回响。他觉得自己的嗓音实在好极了,周围的一切都在欣赏他、赞美他无与伦比的歌喉。钟摆不由自主和着他的拍子,蚊子情不自禁为他伴唱,连他自己的影子都在一晃一晃为他起舞。他决定走出屋外,登台演出。可是离腔走调的破嗓音实在难听,观众忍无可忍发出一片嘘声,最后一个个都逃走了。他在空旷的台上,发出怨言:都说知音难觅,这话真是没错,这些人哪,竟不及我屋子里一只蚊子懂得欣赏!

作者:徐慧芬

SQL连接查询

通过连接运算符可以实现多个表查询。连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一个标志。
连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于将连接操作与WHERE子句中的搜索条件区分开来。所以,在Transact-SQL中推荐使用这种方法。

SQL-92标准所定义的FROM子句的连接语法格式为:

FROM join_table join_type join_table

[ON (join_condition)]

其中join_table指出参与连接操作的表名,连接可以对同一个表操作,也可以对多表操作,对同一个表操作的连接又称做自连接。

join_type 指出连接类型,可分为三种:内连接、外连接和交叉连接。内连接(INNER JOIN)使用比较运算符进行表间某(些)列数据的比较操作,并列出这些表中与连接条件相匹配的数据行。根据所使用的比较方式不同,内连接又分为等值连接、自然连接和不等连接三种。

外连接分为左外连接(LEFT OUTER JOIN或LEFT JOIN)、右外连接(RIGHT OUTER JOIN或RIGHT JOIN)和全外连接(FULL OUTER JOIN或FULL JOIN)三种。与内连接不同的是,外连接不只列出与连接条件相匹配的行,而是列出左表(左外连接时)、右表(右外连接时)或两个表(全外连接时)中所有符合搜索条件的数据行。

交叉连接(CROSS JOIN)没有WHERE 子句,它返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

连接操作中的ON (join_condition) 子句指出连接条件,它由被连接表中的列和比较运算符、逻辑运算符等构成。

无论哪种连接都不能对text、ntext和image数据类型列进行直接连接,但可以对这三种列进行间接连接。例如:

SELECT p1.pub_id,p2.pub_id,p1.pr_info

FROM pub_info AS p1 INNER JOIN pub_info AS p2

ON DATALENGTH(p1.pr_info)=DATALENGTH(p2.pr_info)

(一)内连接
Read the rest of this entry »