posts - 1,  comments - 2,  trackbacks - 0
  2008年5月12日

C++ Blog,这名太专业了,让人有点害怕,特别是向我这种C++的半瓶醋,真害怕玷污了C++这个词啊!
我从没写过Blog,向这种专业方面的就更没写过了,主要目的还是来看别人的Blog,并学习的!呵呵
今天第一次写,实在不知道写点什么,就还是提个问题吧。前几天讨论过一个指针强制转换的问题。测试代码如下:

#include <iostream>
using namespace std;

class Base1
{
public:
    virtual void foo(){cout
<<"Base1    foo"<<endl;};
    virtual void foo1(){cout
<<"Base1   foo1"<<endl;};
};

class Base2
{
public:
    virtual void foo2(){cout
<<"Base2    foo2"<<endl;};
    virtual void foo3(){cout
<<"Base2    foo3"<<endl;};
};

class Derived : 
public Base1, public Base2
{

};
int main()
{
 Derived a;
  (static_cast
<Base1*>((LPVOID)&a))->foo1();//调用Base1.foo1
 (static_cast
<Base1*>(&a))->foo1(); //调用Base1.foo1

 (static_cast
<Base2*>((LPVOID)&a))->foo2();//调用Base1.foo
 (static_cast
<Base2*>(&a))->foo2();//调用Base2.foo2

return 
0;
}


前两个结果都很正确,将a强制转换为其基类的指针,调用基类的函数。
而对于第三个第四个,它们得到的结果却不一样。
第三个我是这样理解的:由于强制转换之后,转换之后的指针根据虚函数表去调用函数,而由于LPVOID的存在,(static_cast<Base2*>((LPVOID)&a))->foo2();调用的是 Derived虚函数表中第一个函数指针所指向的函数,也就是Base1的foo。
因此,对于,(static_cast<Base1*>((LPVOID)&a))->foo1();其调用的也是 Derived中虚函数表中的第二个函数。
第四个的调用是正确的。
因此,如果在申明 Derived的时候,改变一下继承的顺序,class Derived : public Base2, public Base1
那么得到的结果将是(static_cast<Base1*>((LPVOID)&a))->foo1();将会调用虚函数表中的第二个函数,为Base2.foo3。
如果得到的类型是LPVOID类型的,直接使用static_cast转换就会出错,这是我前几天碰到的一个问题,可能是我的设计有问题,不过应该也有解决的方案,我的思路是先计算Derived中基类的偏移,然后再进行转换,不过我还不知道怎么实现,不知道谁能帮我解决或者有更好的解决方案!
第一次写Blog,欢迎大家光临和教导!谢谢^_^

posted @ 2008-05-12 13:17 Guanghong(随意飘荡) 阅读(1231) | 评论 (2)编辑 收藏
仅列出标题  
<2026年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(1)

随笔档案

搜索

  •  

最新评论