快乐小胖兔的一窟

用自己的方式过一生 --- zyq654321

VC知识库BLOG 首页 新随笔 联系 聚合 登录
  23 Posts :: 0 Stories :: 95 Comments :: 2 Trackbacks

公告

Welcome you

留言簿(7)

随笔分类

随笔档案

文章档案

相册

网站联接

BLOG友情链接

搜索

最新评论

阅读排行榜

评论排行榜

        呵呵,最近都很忙,BLOG也没空写,今天在VCKBASE转了一下,手又有点痒,就少写一点吧:
问题的链接见:http://blog.vckbase.com/bruceteen/archive/2006/03/20/18606.html
        其实解释这个问题很简单,VC中显示的没错,星星的想法看上去也没错,但是,请大家注意这个问题,继承或多重继承中常用到的虚函数问题。
        我想说的是,不少人可能都很精通虚函数,也用过不少,但是可能有人会不太注意virtual table,也就是虚表这个问题。如果精通COM的话,这应该可以比较容易理解,因为COM主要就利用这一类虚表。
        星星的代码中的类C从类B和类A中派生出来,同时在类C中重用了类B中的虚函数fb。这里有一个重要概念,此fb函数不权是类C的成员函数,它更是在类C是类B虚表的函数。
        这样就可以演示一下实际情况了,当从C类产生一个新的对象c时,系统同时为c对象生成相应的类B和类C的“实例”(这里的实例指它们的成员和虚表等)。而this的含义并不是完全指c这个对象,它是一个“相对”的意思,这里在多重继承时就让不少人感到了岐义。
        一个小技巧可以理解它,就是改代码为class C: public B, C,这样,类B的虚表就排在了第一个,如此地址就一样了。呵呵,语言表达不是太好,不过基本意思应该到了。
posted on 2006-03-20 15:04 Hercules Space 阅读(2785) 评论(4)  编辑 收藏

Feedback

# re: 解释[周星星]提到的,关于this值不同的问题。 2006-03-20 15:07 freedk
顶一下小胖兔

# re: 解释[周星星]提到的,关于this值不同的问题。 2006-03-20 19:07 周星星
这并不属于bug,cout出来的this值也是正确的,在watch看到的值不同也无可非议,但如果watch看到的值和cout出来的this值相同不是更好?
如果 this 重定向为 B* 的话,每次访问C时都需要再变回来,好处是访问B时简单多了;
如果 this 仍然保持为 C* 的话,每次访问B时都需要转化为B*,好处是访问C时简单多了。
从上面两点看,其优劣点都半斤八两,但this的动态类型是C*呀,按照第二个“如果”来做的话,更简单而且好理解。

# re: 解释[周星星]提到的,关于this值不同的问题。 2006-03-21 09:58 ZYQ
我想要说的要,先不要用主观的意义去理解this和虚表,这会影响你的思维。从程序员的角度来看程序,应该是你将自己看作是程序的一部分,而不是程序成为你所主观的某种东西。一句话,“向计算机一样的去思考”!

# re: 解释[周星星]提到的,关于this值不同的问题。 2006-03-21 10:13 Hercules Space
如果实在要论cout和watch为什么可以不一样。个人认为这是一件好事,这样大家又可以明白cout做了什么,watch它的实际作用又是什么。cout<<this,这句代码使用了标准的C++输出流,要注意的是这个编译器实际要作类型检查的,这里的this无论如何都会是类C的实例。这一部分将会是硬编码(或说是静态的)。再回过头看看watch这个很出色的DEBUG窗口,说它出色就在于此,它不光知道this是类C的实例,还会充分的动态解释它。所以说,cout和watch在这里出现了不一致,但要说的是watch窗口属于debugger部分,它为你提供更为细节的信息。
please enjoy it!

标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]