故题自问 不知也
以前在CSDN的一个问题,今天拿来看看,竟然要从头到尾看过才明白,又惭愧。。。
问题来自《深入浅出MFC》:
有这样的ClassA, ClassB, ClassC
class ClassA
{
public:
int m_data1;
int m_data2;
void func1() { }
void func2() { }
virtual void vfunc1() { }
virtual void vfunc2() { }
};
class ClassB : public ClassA
{
public:
int m_data3;
void func2() { }
virtual void vfunc1() { }
};
class ClassC : public ClassB
{
public:
int m_data1;
int m_data4;
void func2() { }
virtual void vfunc1() { }
};
{
public:
int m_data1;
int m_data2;
void func1() { }
void func2() { }
virtual void vfunc1() { }
virtual void vfunc2() { }
};
class ClassB : public ClassA
{
public:
int m_data3;
void func2() { }
virtual void vfunc1() { }
};
class ClassC : public ClassB
{
public:
int m_data1;
int m_data4;
void func2() { }
virtual void vfunc1() { }
};
ClassB* pb = new ClassB;
ClassC* pc = new ClassC;
pb->m_data1 = 1111;
pc->m_data3 = 3333;
cout << endl << pb << endl;
cout << (int)*((char*)pb+4) << endl;
cout << (int)*((char*)pc+12) << endl;
最后两句为什么输出的是什么?
要回答这样的问题,要清楚类的布局结构,要清楚Little-edian
(char*)pb+4就是pb->m_data1的地址
(char*)pc+12就是pc->m_data3的地址
具体原因,很多人应该都知道了,不再赘述。
int a = 0x00000457;//1111
int b = 0x00000D05;//3333
*((char*)pb+4)这样取到的是0x57, (int)*((char*)pb+4)转换为INT型输出
作者:DylanWind
出处:http://www.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。