旅途

如果想飞得高,就该把地平线忘掉

我自己实验的方法,用来访问私有成员

关键是熟悉内存分布
#include <iostream>
using namespace std;
class A{
private:
   int i;
public:
 void printa()
 {
  printf("%d\n",i);
 }
};
class B{
private:
 A a;
};

int main()
{
  B b;
  A* aa=(A*)&b;
  int* ii=(int*)aa;
  *ii=100;
  aa->printa();
  return 0;
}

100

妈的!太变态!!



#include <iostream>
using namespace std;
class A{
private:
   int i;
public:
 void printa()
 {
  printf("%d",i);
 }
};
class B{
private:
 int j1;
 A a;
 int j2;
public:
 void printb()
 {
    printf("%d\n",j1);
 }
};

int main()
{
  B b;
  int *jj=(int*)&b;
  *jj=100;
  b.printb();
  return 0;
}

得到100




#include <iostream>
using namespace std;
class A{
private:
   int i;
public:
 void printa()
 {
  printf("%d\n",i);
 }
};
class B{
private:
 A a;
 int j;
public:
 void printb()
 {
    printf("%d\n",j);
 }
};

int main()
{
  B b;
  A* aa=(A*)&b;
  int* ii=(int*)aa;
  *ii=100;
  aa->printa();
 

  int*jj=(int*)aa+1;//为什么是1呢?我用sizeof(A)是错的
  *jj=200;

  b.printb();

  return 0;
}
100
200



#include <iostream>
using namespace std;
class A{
private:
   int i;
public:
 void printa()
 {
  printf("%d\n",i);
 }
};
class B{
private:
 A a;
 int j;
public:
 void printb()
 {
    printf("%d\n",j);
 }
};

int main()
{
  B b;
  A* aa=(A*)&b;
  int* ii=(int*)aa;
  *ii=100;
  aa->printa();
 

  int*jj=(int*)aa+1;
  *jj=200;
  b.printb();

  char *jj2=(char*)&b+sizeof(A);//这样才能用sizeof(A)
  *jj2=300;//这里解完地址后,用的是char,最大255,300超出了范围.只取有效的部分,就是44
  b.printb();
  int *jj3=(int*)jj2;
  *jj3=400;
  b.printb();

  return 0;
}

100
200
44
400

posted on 2007-09-05 00:50 旅途 阅读(84) 评论(0)  编辑 收藏 引用 所属分类: C/C++


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理