- 论坛徽章:
- 0
|
(3)我知道VC2005/2010支持编译选项/d1reportAllClassLayout ,可以dump出来所有的类的内存模型。
(4)我知道"占地方的不是函数指针,是虚函数表指针"
问题是,既然s4和s5有两个虚表指针,分别指向s1的虚表和s2的虚表,那么我用模拟的办法应该可以访问到这两个虚表。
所以,我写了一段测试程序。测试程序可以得到s1,s2,s3的虚表的地址,但是对于s4和s5,只能得到第一个虚表的位置,而得不到第二个虚表的位置。这是为什么呢?下面这段测试代码,运行结果如下:
4,4,4,8,8
s1 vtble address=00416964
s2 vtble address=00416954
s3 vtble address=004169A4
s4 vtble address1=00416A94
s4 vtble address2=CCCCCCCC //是不是应该指向s4::s2的虚表,不应该是CCCCCCCC
s5 vtble address1=004169B0
s5 vtble address2=CCCCCCCC //是不是应该指向s5::s2的虚表,不应该是CCCCCCCC
Press any key to continue . . .
- #include "stdafx.h"
- #include <string>
- using namespace std;
- struct s1{
- virtual void f(){};
- }o1;
- struct s2{
- virtual void g(){};
- }o2;
- struct s3: public s1{
- virtual void x(){};
- }o3;
- struct s4: public s1,s2{
- }o4;
- struct s5: public s1,s2{
- virtual void y(){};
- }o5;
- int main( void){
- printf("%d,%d,%d,%d,%d\n\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4),sizeof(s5));
- typedef void(*virtual_function)(void);
- struct s123_equivalence{
- virtual_function* pVtbl;
- }o123;
- memcpy(&o123,&o1,sizeof(s3));
- printf("s1 vtble address=%p\n",o123.pVtbl);
- memcpy(&o123,&o2,sizeof(s3));
- printf("s2 vtble address=%p\n",o123.pVtbl);
- memcpy(&o123,&o3,sizeof(s3));
- printf("s3 vtble address=%p\n",o123.pVtbl);
- struct s45_equivalence{
- virtual_function* pV1;
- virtual_function* pV2;
- }o45;
- memcpy(&o45,&o4,sizeof(s3));
- printf("s4 vtble address1=%p\n",o45.pV1);
- printf("s4 vtble address2=%p\n",o45.pV2);
- memcpy(&o45,&o5,sizeof(s3));
- printf("s5 vtble address1=%p\n",o45.pV1);
- printf("s5 vtble address2=%p\n",o45.pV2);
- return 0;
- }
复制代码 |
|