这本书忙中偷闲读了半年有余才看完4章 每次总是看过几页又得往回翻 年底重拾此书 写下一些代码调试了书中知识点
发现毕业几年来第一次碰到一本书写得如此有味道
前几章的内容不外乎讲各厂家编译器里对象初始化、内存布局、内存管理、虚表的实现细节
细读来 以前理解不是很深刻的多重继承下指针转化的偏移开销 初始化表和继承member的执行顺序 派生类和基类的布局方式 虚函数表的生成和调用等问题都收益颇多

太久没有更新过这个地方了 花了点时间写的测试代码贴上来献献丑

#include "stdafx.h"
#include <windows.h>


class Point2d
{
public:
Point2d()
{
x= 0.1;
y=0.2;
}
~Point2d()
{
}
public:
virtual DWORD getPos(){return pos;};
public:
float x;
float y;
static DWORD pos;
};
DWORD Point2d::pos = 3;
int _tmain(int argc, _TCHAR* argv[])
{
Point2d point2d;
//取类基址 地址应该在栈上
void* p = (void*)&point2d;
//取vptr地址 ms的编译器把vptr放在类开头
unsigned int pVptr = (unsigned int)*(unsigned int*)p;
//取vtable地址
unsigned int* p2 = (unsigned int*)pVptr;
//vtable里第一个DWORD就是getPos的指针
unsigned int addr = *p2;
//调用虚函数getPos
DWORD ret = 0;
__asm
{
push eax;
mov eax,addr;
call eax;
mov ret,eax;
pop eax;
}
printf(”getPos= %u\n”,ret);
printf(”&point2d.x = %p\n”,&point2d.x);
printf(”&point2d.y = %p\n”,&point2d.y);
printf(”&Point2d::x = %p\n”,&Point2d::x);
printf(”&Point2d::y = %p\n”,&Point2d::y);
printf(”&point2d.pos = %p\n”,&point2d.pos);
printf(”&Point2d::pos = %p\n”,&Point2d::pos);
return 0;
}

本文相关评论 - 1条评论都没有呢

目前还没有评论.