+ parrary 0x0012fe3c int * *
+ d {...} DerivedA
func2 0x008f1032 BaseA::foo(void) void (void)*
func5 0x008f1032 BaseA::foo(void) void (void)*
func1 0x008f102d DerivedA::goo(void) void (void)*
func3 0x008f1023 BaseA::bar(void) void (void)*
func4 0x008f102d DerivedA::goo(void) void (void)*
func7 0x008f102d DerivedA::goo(void) void (void)*
func6 0x008f1023 BaseA::bar(void) void (void)*
func9 0x008f1023 BaseA::bar(void) void (void)*
func8 0x008f1032 BaseA::foo(void) void (void)*
+ p 0x0012fe3c int * *
解析:
指针的指针
int **p---> [ vptr1 ]---> func1
---> func2
---> func3
[vptr2] ---> func4
如果不使用指针的指针,第一种方式需要非常多的转换,很难操作
第二种方式 *p 是指向func1的指针,(*p+1)指向func2, (*p+2)指向func3
p+1指向vptr2
第三种方式:p[0] 第一层解引用,指向vptr1,p[0][0]指向func1
p[1]指向vptr2,p[1][0]指向func4。
#include <iostream>
class BaseA
{
public:
virtual void goo()
{
std::cout<<"base goo"<<"\n";
}
virtual void foo()
{
std::cout<<"base foo"<<"\n";
}
virtual void bar()
{
std::cout<<"base bar"<<"\n";
}
};
class DerivedA: public BaseA
{
public:
virtual void goo()
{
std::cout<<"derive goo"<<"\n";
}
};
typedef void (*FUNC) (void);
int main()
{
DerivedA d;
std::cout<<" vptr "<< (int)(*((int *)&d))<<"\n";
FUNC func1 = (FUNC)(*((int*)(*((int *)&d))));
func1();
FUNC func2 = (FUNC)(*((int*)(*((int *)&d))+1));
func2();
FUNC func3 = (FUNC)(*((int*)(*((int *)&d))+2));
func3();
/////////////////////////////////////////
int ** p = (int **)&d;
FUNC func4 = (FUNC)*(*p);
FUNC func5 = (FUNC)*(*p + 1);
FUNC func6 = (FUNC)*(*p + 2);
////////////////////////////////////////
int ** parrary = (int **)&d;
FUNC func7 = (FUNC)parrary[0][0];
FUNC func8 = (FUNC)parrary[0][1];
FUNC func9 = (FUNC)parrary[0][2];
return 0;
}
posted on 2014-07-10 10:51
pizzx 阅读(697)
评论(0) 编辑 收藏 引用 所属分类:
c++/boost