Author Archives: 灰灰

About 灰灰

杭州电子科技大学 计算机科学与技术专业

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 … Continue reading

29th July 2010 7 Comments Permalink

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

我们以沉痛和愤怒的心情正式宣告,我所怀柔试验基地遭暴力拆毁,钱学森先生回国建立的首批实验室被夷为平地。 2010年7月17日上午,试验基地的保安人员被一伙不明身份人员控制,失去人身自由。在此期间,共计9处房屋被大型铲车与推土机夷为平地,一批重要的科研装置和设备被砸毁掩埋。2010年7月22日至23日,该试验基地再遭持续地肆意毁坏,钱学森先生回国初期指导研制的科研装备等大量历史性文物、国家973项目试验装备、国防重大科研任务的仪器装置和备件等以“垃圾”的名义被清除出场,值守该试验基地的工作人员深受刺激入院治疗。 该试验基地是钱学森先生回国后亲自选址和创建的,是我国第一个火箭研究与试验基地,为我国“两弹一星”做出了重大的历史性贡献。目前,该试验基地正承担着国家重大专项、国家重大基础研究发展计划项目等重大科研任务。此次试验基地被毁,初步统计的国有资产直接损失高达1700余万元。更加令人痛心的是,一批我国现代科技史上代表性的珍贵文物被肆无忌惮的捣毁和清运,一批国家级的重大科研任务被迫停滞。 在我国和谐、稳定、快速发展的大好局面下,在中国科学院这一神圣的科学殿堂,发生了如此野蛮的暴力事件,令人震惊!力学所参与试验基地建设和“两弹一星”攻关任务的院士和科学家们悲愤交加,全体科研人员极为愤慨。“炎夏似隆冬,白昼如夤夜”是我们此刻共同的感受。 事件发生后,我们已经在第一时间向中科院有关领导和部门进行了汇报,并向当地公安机关报案。我们要相信党、相信组织,让我们一起期待法律的公正判决! 请全体职工和学生克制情绪,保重身体,克服困难,团结起来,勤奋工作,以实实在在的科研工作报效祖国,告慰钱学森先生等的在天之灵! 中国科学院力学研究所 2010年7月23日 详见:http://www.imech.ac.cn/xwdt/tpxw/201007/t20100723_2909933.html

25th July 2010 2 Comments Permalink

Digests for July 23rd

Shared 去掉链接时虚线框的几个方法.

23rd July 2010 0 comments Permalink

Digests for July 22nd

Shared 我们正在习惯的50个异常现象-赵牧博客.

22nd July 2010 1 Comment Permalink

“新伊索寓言”

“新伊索寓言” 橡树和芦苇 一棵大橡树被大风连根拔起,飞到河那边,落到一片芦苇旁。橡树对芦苇说:”你们那么轻弱,我真不明白你们怎么会不被狂风彻底摧残呢?”芦苇回答说:”你和风抗争,最后你失败了。而我们正好相反,只要有一点点微风,我们就在它面前弯下腰来,因此就不会被折断,所以能避免摧残。” 芦苇正得意洋洋地说教着,一个农人走过来,发现了这棵橡树,如获至宝。农人家里准备打家具,这根橡木正合适。农人临走时还割倒了一片芦苇,农人家里也正缺少柴禾。过了几天,芦苇被送进灶膛时,忍不住又看了一下那棵橡树–橡树已被打造成一只柜子,这回芦苇不再多舌。 核桃树 路旁的核桃树结满了核桃。过路的行人为了把核桃打下来,用石头打它,用棍子敲它,把它的树枝都弄折了。核桃树不由地叹息道:”唉,我的命真苦啊!我用我的核桃给人们享用,而他们却给我这种痛苦做回报!”它的叹息给旁边的另一棵不结核桃的核桃树听到了,不结核桃的核桃树同情地说:”看来,你得学我的样,不结一颗核桃出来,那么,人们又怎能摧残你呢!”结核桃的核桃树想了想说:”到底我也有我的荣耀啊!人们走过我的身边,常常会对我发出赞叹,赞叹我的丰美,赞叹我的能耐。一旦不结果子了,我还能得到这些荣耀吗?再说,做一棵不结核桃的核桃树,还能算是核桃树么?”不结核桃的核桃树听了此话生气地说:”我好心好意地劝你,你倒要嘲笑我,你既要享受荣誉,那就只好受苦了!” 唱歌的人 有个人没有唱歌的天分,但很喜欢唱歌。平常他在家里对着墙壁,大唱特唱,声音在屋里回响。他觉得自己的嗓音实在好极了,周围的一切都在欣赏他、赞美他无与伦比的歌喉。钟摆不由自主和着他的拍子,蚊子情不自禁为他伴唱,连他自己的影子都在一晃一晃为他起舞。他决定走出屋外,登台演出。可是离腔走调的破嗓音实在难听,观众忍无可忍发出一片嘘声,最后一个个都逃走了。他在空旷的台上,发出怨言:都说知音难觅,这话真是没错,这些人哪,竟不及我屋子里一只蚊子懂得欣赏! 作者:徐慧芬

20th July 2010 0 comments Permalink
Statistical data collected by Statpress SEOlution (blogcraft).