免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1583 | 回复: 7
打印 上一主题 下一主题

请教个问题:CPP的考试题,谢谢! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-08 17:12 |只看该作者 |倒序浏览
#include <iostream.h>;
#include <stdio.h>;

class Person
{
        private:
        int i;
        int f;
        public:
                int GetF(){return f;}
                void SetF(int f) {this->;f = f;}
                virtual void SetI(int i){this->;i = i;}
} ;

int main()
{
        Person p;
        char* pc;
        p.SetF(1);
        printf("%d\n", p.GetF());

        pc = (char*)&amp;
        pc += 4;
        *( (int*) pc) = 12;
        printf("%d\n", p.GetF());
        return 0;
}

why the output is 1,1 not 1,12 thanks!

论坛徽章:
0
2 [报告]
发表于 2005-07-09 10:02 |只看该作者

请教个问题:CPP的考试题,谢谢!

为什么是1,12?
你在p.SetF(1)把p.f置一后就再也没改变过,当然还是1了,怎么会是12呢
另外你好象打错了吧,pc = (char*)& 是什么意思?难道是pc = (char*)&amp;?
不解……

论坛徽章:
0
3 [报告]
发表于 2005-07-09 15:04 |只看该作者

请教个问题:CPP的考试题,谢谢!

&之后是p;不知道为什么显示不出来

论坛徽章:
0
4 [报告]
发表于 2005-07-09 17:40 |只看该作者

请教个问题:CPP的考试题,谢谢!

p 是类person的一个对象,而pc的基类型是char,虽然你在后面做了类型转换,但语句*( (int*) pc) = 12; 你是想对p对象的哪个成员进行修改, 这个不明确.另外,即使你想对p的某个成员进行修改也是不合法的,因为i,f是私有成员,不能被随意修改,要通过公有成员函数进行修改.这就是结果为1,1的原因.

论坛徽章:
0
5 [报告]
发表于 2005-07-09 21:25 |只看该作者

请教个问题:CPP的考试题,谢谢!

你可以试试显示&p.f(f是私有的只有在类的成员里显示了)再看pc是不是指向这里,应该说通过指针操作可以扰过私有保护的,因为私有保护在编译时而不在运行时

论坛徽章:
0
6 [报告]
发表于 2005-07-11 00:19 |只看该作者

请教个问题:CPP的考试题,谢谢!

这实际上是一个带虚函数的C++类的在内存中的布局问题,当C++类带虚函数时,
它在内存中的布局的最开始的部分是虚函数表的指针,也就是说,当使用强制类型转换pc=(char *)&p后,pc所指向的是C++对象的虚函数表的指针,这个指针实际上是一个四字节的值pc +=4后,pc所指向的是Person实例的i成员而不是f成员,所以你输出f的值当然不会变.如果你输出i的值的话,就会发现实际上i成员变量值已经变成了12,你的错误在于你没有考虑引入虚函数时类实例在类存中布局的变化.
也就是说,当类中存在虚函数时,编译器自动增加了一个数据成员--虚函数表的指针,详细情况推荐读一下<<深入C++对象模型>;>;,好象是电力出版社出版的.

论坛徽章:
0
7 [报告]
发表于 2005-07-11 18:27 |只看该作者

请教个问题:CPP的考试题,谢谢!

原帖由 "renstone921" 发表:
这实际上是一个带虚函数的C++类的在内存中的布局问题,当C++类带虚函数时,
它在内存中的布局的最开始的部分是虚函数表的指针,也就是说,当使用强制类型转换pc=(char *)&p后,pc所指向的是C++对象的虚函数表的指针,这个..........


thanks the above several brothers,your help are all appreciated,cheers!thanks!

论坛徽章:
0
8 [报告]
发表于 2005-07-11 18:48 |只看该作者

请教个问题:CPP的考试题,谢谢!

.....

学习到了

不过这种东西部不怎么实用吧

如果要真用到了这种东西,估计就是设计出了大问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP