注册 登录
编程论坛 C++教室

C++问题,有空的来看看,帮解决个问题

无诲今生 发布于 2009-10-29 11:14, 517 次点击
谁能帮解释下这个程序?主要是什么会输出100?
#include<iostream.h>   
  class   base{};     
  class derived1:public base   
  {     
  private:     
  int d_a1;     
  int d_b1;     
  public:     
  void display_a(void)     
  {     
  cout<<"d_a1 ="<<d_a1<<endl;;     
  }     
  };   
  
  class derived2: public base     
  {     
  public:     
  int d_a2;     
  int d_b2;     
  };     
  void main()     
  {     
  int base::*p;  
  p=(int base::*)&derived2::d_a2;         
  derived1 d1;     
  d1.*p=100;        
  d1.display_a();   
  }     
3 回复
#2
东海一鱼2009-10-29 12:43
主要是这个语句的理解:

int base::*p;
p=(int base::*)&derived2::d_a2;

在这里,p不是普通意义上的变量指针,它是基于类base的模型偏移指针。也就是说:
p=(int base::*)&derived2::d_a2;

因为&derived2::d_a2的偏移为0,所以p=0;

那末实质上

derived1 d1;      
d1.*p=100;         
d1.display_a();  

等价于:

int* pint;
derived1 d1;
pint = (int*)&d1;
*(pint + 0) = 100;       //体会一下  
d1.display_a();  





#3
无诲今生2009-10-30 21:45
为什么“因为&derived2::d_a2的偏移为0,所以p=0;“??
#4
东海一鱼2009-11-01 11:41
这个问题我很难描述,给你看个变动,你体会一下:
程序代码:
#include<iostream.h>   
class   base{};     
class derived1:public base   
{     
private:     
    int d_a1;     
    int d_b1;     
public:     
    void display_a(void)     
    {     
        cout<<"d_a1 ="<<d_a1<<endl;;     
    }  
    virtual int pif(){cout<<"Test"<<endl;return 0;};
};   

class derived2: public base     
{     
public:     
    int d_a2;     
    int d_b2;
    virtual int pif(){cout<<"Test1"<<endl;return 0;};
};
 void main()     
  {     
  int base::*p;  
  p=(int base::*)&derived2::d_a2;         
  derived1 d1;     
  d1.*p=100;        
  d1.display_a();   
  }           
加了虚函数,你的这个代码仍然继续工作。而我的
int* pint;
derived1 d1;
pint = (int*)&d1;
*(pint + 0) = 100;        
d1.display_a();
就出现了错误。

要改为:

int* pint;
derived1 d1;
pint = (int*)&d1;
*(pint + 1) = 100;
d1.display_a();

OK。为什莫???因为内存模型的问题。虚函数表(vtable)占用了4个字节的空间。
1