首页 > 代码库 > 虚函数指针和虚函数表
虚函数指针和虚函数表
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,是否是指最后一个?
虚函数指针和虚函数表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。