jejer@wordpress Anything Worth Doing is Worth Doing Well

24Oct/11Off

Linux C/C++ IDE slickedit 破解

version: linux 32bit 16.0.3.0
slickedit/bin/vs 偏移 0x190F0 处 0F B6 45 D7( 83 C4 4C 5B 5E 5F 5D C3 8B 75 C4 C6) 改为 B0 01 90 90

参考 http://zhiwei.li/text/2011/05/slickedit-2011/

谁能教我这个地址是怎么找到的!?

29Oct/10Off

基类与派生类互转时需要注意void*类型

// Test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

class A
{
public:
	A():a(0){}
	int a;
	void FnA(){printf("A %d\n",a);}
	virtual void VFnA(){printf("VA %d\n",a);}
};

class B
{
public:
	B():b(1){}
	int b;
	void FnB(){printf("B %d\n",b);}
	void FnB2(){printf("B2 %d\n",b);}
	virtual void VFnB(){printf("VB %d\n",b);}
};

class C
{
public:
	C():c(2){}
	int c;
	void FnC(){printf("C %d\n",c);}
	void FnC2(){printf("C2 %d\n",c);}
	void FnC3(){printf("C3 %d\n",c);}
	virtual void VFnC(){printf("VC %d\n",c);}
};

class T : public A, public B, public C
{
public:
	void FnT(){}
	virtual void VFnA(){printf("TVA %d\n",a);}
	virtual void VFnB(){printf("TVB %d\n",b);}
	virtual void VFnC(){printf("TVC %d\n",c);}
};

void Fn(C* c)
{
	c->FnC();
}

void Fn2(void* p)
{
	C* pC = (C*)p;
	pC->FnC3();
}

void Fn3(void* p)
{
	C* pC = (C*)p;
	printf("Fn3:c=%d ",pC->c);
	pC->VFnC();
}

int _tmain(int argc, _TCHAR* argv[])
{
	T t;
	A* pA = &t;
	B* pB = &t;
	C* pC = &t;

	Fn(&t);
	Fn2(&t);
	Fn2((B*)&t);
	Fn3(&t);
	Fn3((B*)&t);
	return 0;
}

//结果
//C 2
//C3 0
//C3 1
//Fn3:c=0 TVA 0
//Fn3:c=1 TVB 1

T的内存排布示意:
vfptr

Filed under: cpp No Comments