金山的一道面试题(考察面向对象和内存模型)

lylymb 2008-12-06 05:40:08
#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();
}
输出的是 1.
为什么呢?
...全文
605 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
wind_breez 2008-12-16
  • 打赏
  • 举报
回复
很变态一道题!!
初学者一枚 2008-12-16
  • 打赏
  • 举报
回复
顶9楼的
RMB_Exist 2008-12-16
  • 打赏
  • 举报
回复
up 楼主
qq675927952 2008-12-16
  • 打赏
  • 举报
回复
up 9L
jqx_ah 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 changsheng230 的回复:]
pb 指向的是对象的内存首地址,比如0012FF50, 当pb->func()调用 B::func() 来打印m_c时,编译器对m_c对他的认识就是m_c距离对象的偏移量:0,于是打印了对象a首地址的编译量0012FF50+0 变量值。 以下代码来证明解释:

C/C++ code
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
{
publ…
[/Quote]
UP
pony_ml 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zy1691 的回复:]
这题很2
[/Quote]

答题的时候写这个估计能给满分,哈哈
weixieming 2008-12-16
  • 打赏
  • 举报
回复
前面的operatingtuzi 说的跟我的想法一样
因为类的地址是按下面的规则来划分的,首先是成员变量,再者是虚函数,而普通的成员函数是在调用时才分配地址的,在构造函数时是不会给他们分配地址的;
成员变量的先后一般是按变量的声明的顺序来分配的,故而上面是m_a最先分配;
具体的流程应该是这样:
A a; //先实例化这个a对象,,由构造函数完成对m_a,m_b的初始赋值,按上面我说的,其首地址应该是m_a
B *pb = (B*)(&a); //将a对象的首地址值m_a通过B*的类型Cast将其首地址赋给对象pb的首地址,于是接受到m_a的地址,取其值就有了上面的结果
xtting_8984313 2008-12-16
  • 打赏
  • 举报
回复
而且c++里面明确的使用新型的类别转换,写个class,在这用旧式转换,干吗啊?
炫技,还是要误导面试者,到金山后就搞脑残问题啊!

dynamic_cast
static_cast
const_cast
reinterpret_cast
simonyuan 2008-12-16
  • 打赏
  • 举报
回复
1&9L理解得应该都对的,pb调用B的方法操作了A的成员变量m_a,因为m_a在A中的偏移值跟m_c在B中的偏移值一样。
无名剑 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cyblueboy83 的回复:]
这道题还应该加上编译器环境

标准的CPP貌似没有规定量成员变量在对象内存结构内的次序吧
[/Quote]

是没规定,可至今所有编译器的排序都是一致的,当然你想写个山寨版的编译器弄乱次序我就无话可说了^_^
无名剑 2008-12-16
  • 打赏
  • 举报
回复
因为下面那句传的是地址,
a在内存分布就是 |1|2|
所以pb指针指向的内存空间就是在|1|里面,
也就是说pb指向的类的内存空间是|1|
那么里面的m_c=1,所以打印出来的是1

B *pb = (B*)(&a); //这句只是定义一个指针,根本就没有执行B的构造函数

gccdy 2008-12-16
  • 打赏
  • 举报
回复
关注金山
piaoyanglvcha 2008-12-16
  • 打赏
  • 举报
回复
ym~~~~~~~
SearchLife 2008-12-16
  • 打赏
  • 举报
回复
关注
sw1024 2008-12-16
  • 打赏
  • 举报
回复
没实际意义~
bobye1230 2008-12-15
  • 打赏
  • 举报
回复
.......mark
heaventt 2008-12-15
  • 打赏
  • 举报
回复
感觉 2楼和9楼的 是对的
林初茵 2008-12-15
  • 打赏
  • 举报
回复
ddddddddddddddddddddddddddddddddddddddd
licry01 2008-12-09
  • 打赏
  • 举报
回复
mark
deyangcai 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zy1691 的回复:]
这题很2
[/Quote]
哥们貌似很喜欢《闯关东》啊!
加载更多回复(14)

64,633

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧