首页 > 代码库 > 虚函数指针和虚函数表

虚函数指针和虚函数表

 1 #include <iostream> 2  3 using namespace std; 4  5 class father 6 { 7 public: 8     father(int x):m_idata(x) 9     {}10     11     virtual void show(int idata)12     {13         cout << "papa" << endl;14         cout << idata-20 << endl;15     }16     virtual ~father(){}17     18 private:19     int m_idata;20 };21 22 class child:public father23 {24 public:25     child(int x, int y):father(x),m_ichild_data(y)26     {27     }28     29     virtual void show(int idata)30     {31         cout << "wawa" << endl;32         cout << idata << endl;33         //cout << m_ichild_data << endl;  通过虚函数表直接调用,无法访问成员变量,没有对应到对象上 34     }35     36     virtual ~child(){}37 private:38     int m_ichild_data;39     40 };41 42 typedef void (* FUNC)(int);43 44 int main()45 {46     father fa(9);47     cout << "object address is vptr  address: " << &fa << endl;48     cout << "111 vtable address: " << *(int *)(&fa) << endl; //suppose pointer is 4 bytes ,value of vptr49     cout << "func show address: " << *(int *)(*(int *)(&fa)) << endl;50     int x=66;51     //firstchild.show(x);52     //FUNC func = ( void (*)(void) )(*(int *)(*(int *)(&firstchild)) );53     FUNC func3 = ( FUNC )(*(int *)(*(int *)(&fa) ));54     func3(x);55     56     child firstchild(88,3456);57     cout << "------------first child-------------" << endl;58     cout << "object address is vptr  address: " << &firstchild << endl;59     cout << "vtable address: " << *(int *)(&firstchild) << endl; //suppose pointer is 4 bytes ,value of vptr60     cout << "func show address: " << *(int *)(*(int *)(&firstchild)) << endl;61     //int x=66;62     //firstchild.show(x);63     //FUNC func = ( void (*)(void) )(*(int *)(*(int *)(&firstchild)) );64     FUNC func = ( FUNC )(*(int *)(*(int *)(&firstchild)) );65     func(x);        //没有this指针 无法显示数据成员 66     67     cout << "first data member: " << *(int *)((int *)(&firstchild)+1) << endl;68     69     cout << endl << "-------------second child--------------" << endl;70     child secondchild(888,222);71     cout << "object address is vptr  address: " << &secondchild << endl;72     cout << "value of vptr: " << *(int *)(&secondchild) << endl; //suppose pointer is 4 bytes73     cout << "func show address: " << *(int *)(*(int *)(&secondchild)) << endl;74     75     FUNC func2 = ( FUNC )(*(int *)(*(int *)(&secondchild)) );76     func2(x);        //没有this指针 无法显示数据成员 77     78     return 0;79 }

1 每个类对应一个虚函数表,不同对象的第一个slot都是相同值,即该表的地址。

技术分享
2 从地址看7c和88之间只有12个字节,应该是x和func3被优化掉了。
3 inside c++ object model说虚表里第一个是type_info,是否是指最后一个?

 

虚函数指针和虚函数表