64,676
社区成员
发帖
与我相关
我的任务
分享
class Base {
public:
Base(){cout <<"Base::Base" << endl; }
virtual void f() { cout <<"Base::f" << endl; }
virtual ~Base(){ cout <<"Base::~Base" << endl;}
int a;
};
class Drive:public Base
{
public:
Drive(){cout <<"Drive::Drive" << endl; }
virtual void f() { cout <<"Drive::f" << endl; }
~Drive(){ cout <<"Drive::~Drive" << endl;}
};
typedef void (*Fun)(void);
typedef void (Base::*Fun2)(void);
typedef void (Drive::*Fun3)(void);
int fun(Base b)
{
b.f();
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
Drive d;
d.a = 5;
fun(d);
Base* pbase = &((Base)d);
printf("d:%p\t pbase:%p\n",&d, pbase);
printf("d.a:%p\t pbase->a:%p\n",d.a, pbase->a);
printf("&d.a:%p\t &pbase->a:%p\n",&d.a, &pbase->a);
pbase->f();
Fun2 pFun2 = &Base::f;
(pbase->*pFun2)();
printf("&Base::f:%p\n",pFun2);
Fun pFun = (Fun)*((int*)*(int*)(pbase));
pFun();
printf("虚表第一项地址内容:%p\n\n",pFun);
pbase = &(d);
printf("d:%p\t pbase:%p\n",&d, pbase);
printf("d.a:%p\t pbase->a:%p\n",d.a, pbase->a);
printf("&d.a:%p\t &pbase->a:%p\n",&d.a, &pbase->a);
pbase->f();
Fun3 pFun3 = &Drive::f;
((Drive *)pbase->*pFun3)();
printf("&Drive::f:%p\n",pFun3);
pFun = (Fun)*((int*)*(int*)(pbase));
pFun();
printf("虚表第一项地址内容:%p\n\n",pFun);
return 0;
}