请问程序会输出什么结果:
- #include <stdio.h>
- class A
- {
- public:
- A() {m_a = 1; m_b = 2;}
- ~A(){};
- void fun(){printf("%d%d", m_a,m_b);}
- private:
- int m_a;
- int m_b;
- };
- class B
- {
- public:
- B(){m_c = 3;}
- ~B();
- void fun() {printf("%d", m_c);}
- private:
- int m_c;
- };
- void main()
- {
- A a;
- B *pb = (B*)(&a);
- pb->fun();
- }
在VC 6.0的编译环境下,输出的是 1.
个人认为:
类的内存分配方式和模型都是相同的。通过(B*)(&a);的强制类型转换,把指针B类的指针pb指向类A a这块临时栈内存中。
因为类成员函数的地址是写在静态存储区的。所以这个时候 pb->fun();调用的还是 类B中的fun(); 接着,fun()访问m_c变量的值。
因为前面发生了强制类型转换。所以fun()读取m_c值的时候,实际上是读取A a临时变量在栈中分配的内存。而栈的分配是按照类成员变量顺序来分配的。第一个是int类型的变量就是最前面四个字节,第二个是char的,那么就是第5个字节。类似这样。。 那么这时候读取 m_c 实际上就是读的类A临时变量a的堆栈的前四个字节(因为m_c和m_a都是第一个成员变量。它们的内存是匹配的)。所以m_c的值看起来是等于m_a。实际我们访问的是m_a的值。