呵呵,最近都很忙,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的虚表就排在了第一个,如此地址就一样了。呵呵,语言表达不是太好,不过基本意思应该到了。