赞
踩
目录
今天在看别人面经的时候发现了这个问题,一时间发现自己也说不清楚,还想当然的以为“虚函数表既然是类对象公有的,那么应该在静态存储区”,想当然终究只是想当然,经过试验得知,这种想法是错误的。
由于不同的编译器在虚函数表上的实现可能不同,下面以g++来进行分析。
先创建一个有虚函数的类A,如下所示:
- class A
- {
- public:
- A(){};
- ~A(){};
- virtual void vfun(){cout<<"vfun called!"<<endl;}
- };
既然要知道虚函数表的位置,那么自然就需要找到虚函数表的地址。我们知道,对于类A这种简单的类,其对象内存布局的最开始四个字节就是一个虚函数表指针(32位编译器),而这个指针变量的值自然就是虚函数表的地址了,因此,第一步就是获取这个虚函数表指针来找到虚函数表的地址:(可参考)
<A *a = new A();
long vbaddr=*(int *)a; //虚函数表地址
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。