| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 517 人关注过本帖
标题:C++问题,有空的来看看,帮解决个问题
只看楼主 加入收藏
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
结帖率:93.48%
收藏
已结贴  问题点数:20 回复次数:3 
C++问题,有空的来看看,帮解决个问题
谁能帮解释下这个程序?主要是什么会输出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();   
  }     
搜索更多相关主题的帖子: private include public 
2009-10-29 11:14
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:20 
主要是这个语句的理解:

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();  






举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-10-29 12:43
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:0 
为什么“因为&derived2::d_a2的偏移为0,所以p=0;“??

顺境逆境切莫止境,得意失意切莫在意。
2009-10-30 21:45
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
这个问题我很难描述,给你看个变动,你体会一下:
程序代码:
#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个字节的空间。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2009-11-01 11:41
快速回复:C++问题,有空的来看看,帮解决个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017222 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved