请先看代码:
- #include <iostream>
- #include <string>
- using namespace std;
- class A
- {
- public:
- A()
- {
- m_a=1;
- m_b=2;
- }
- ~A()
- {
- };
- void fun()
- {
- printf("%d%d",m_a,m_b);
- }
- public:
- int m_a;
- int m_b;
- };
- class B
- {
- public:
- B()
- {
- m_c=3;
- }
- ~B()
- {
- };
- void fun()
- {
- printf("%d\n",m_c);
- }
- public:
- int m_c;
- };
- int main()
- {
- A a;
- B* pb=(B*)&a;
- cout<<&a<<endl; //输出a对象的地址
- cout<<&(a.m_a)<<endl; //输出a对象数据成员m_a的地址
- printf("%p\n",&A::m_a); //输出a对象数据成员m_a相对于a对象的偏移地址
- printf("%p\n",&A::m_b); //输出a对象数据成员m_b相对于a对象的偏移地址
- printf("%p\n",&B::m_c); //输出类B数据成员m_b相对于类B的偏移地址
- pb->fun();
- return 0;
- }
运行结果:
解释:难点在于内存偏移问题的理解
B* pb = (B*)(&a);这是一个野蛮的转化,强制把a地址内容堪称是一个B类对象,pb指向的是a类的内存空间:pb->fun();正常情况下,B类只有一个元素int m_c,但是a类的内存空间中存放第一个元素的位置是m_a,pb指向的是对象的内存地址,上例为0012FF6C,当pb->fun()调用B::fun()来打印m_c时,编译器对m_c的认识就是m_c距离对象的偏移量0,于是打印了对象a首地址的偏移量0012FF6C+0变量的值,所以pb->fun()打印的是m_a的值1;
转载于:https://blog.51cto.com/lixiaomeng/971187