stand on the shoulders of giants

故题自问 不知也

以前在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()   {         }   
  };


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型输出

posted @ 2009-01-11 22:55  DylanWind  阅读(187)  评论(0编辑  收藏  举报