读书人

虚表完事的节点的值(0)为什么不能被直

发布时间: 2012-11-15 15:16:14 作者: rapoo

虚表结束的节点的值(0)为什么不能被直接cout出来

C/C++ code
class Base{      public:             virtual void f(){cout<<"Base::f"<<endl;}             virtual void g(){cout<<"Base::g"<<endl;}             virtual void h(){cout<<"Base::h"<<endl;}      };int main(int argc,char **argv){        typedef void(*Fun)(void);        Fun pfun=NULL;    Base b;    cout<<"虚表地址:"<<&b<<endl;    cout<<"虚表中第一个函数的地址:"<<*(int*)(&b)<<endl;    //cout<<"虚表结尾:"<<*((int*)*(int*)(&b)+3)<<endl;    //error    int m=*((int*)*(int*)(&b)+3);    cout<<m<<endl;    //ok}

如代码所示,为什么虚表结尾的0不能通过cout打印,却可以赋值给m

cout时的错误是Access violation reading location 0x00000000,是说明此访问地址非法,但给m赋值的时候不是也访问了么?

[解决办法]
类函数是带有this指针的
[解决办法]
应该是指针加3,得到第三个虚函数的指针,而不是指针值加3得到第一个虚函数地址加3
C/C++ code
cout<<"虚表结尾:"<<*((int*)(&b)+3)<<endl;    //error
[解决办法]
太高端了这个。
[解决办法]
虚表地址:0030FACC
虚表中第一个函数的地址:10319932
虚表结尾:0
0

我的是可以打印的呀
[解决办法]
我上边不是回答了么……你把
cout<<"虚表结尾:"<<*((int*)*(int*)(&b)+3)<<endl; //error
改成
cout<<"虚表结尾:"<<*((int*)(&b)+3)<<endl; //error
就可以了啊

读书人网 >C++

热点推荐