关于C++数据封装的问题,请教高手

yrdyrdsyr 2001-11-06 03:51:47
#include<iostream.h>


class Base
{
private:
int a;
char b;

public:
Base()
{
a=1;
b='b';

}

virtual void show()
{
cout<<"In Base class: a="<<a<<endl<<endl;
cout<<"In Base class: b="<<b<<endl<<endl;
}

};


main()
{
int* x;
char* y;
Base b1;

//不用对象的接口,直接读出私有对象的值

x=reinterpret_cast<int*> (&b1); //第一个地址是virtual table的地址

x++; //跳到int a 的地址

cout<<*x<<endl; //输出对象中a的值

x++; //跳到char b的地址面,仍旧是int型的指针

y=reinterpret_cast<char*> (x); //转换成char的指针

cout<<*y<<endl; //输出对象中b的值


//不用对象的接口,直接改变私有对象的值
x--;
*x=100;
*y='z';

b1.show();




}
...全文
193 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whitedwarf 2001-11-08
  • 打赏
  • 举报
回复
这样的程序也可以称为“封装”

简直是嘲笑数据保护的思想

既然你想访问数据成员何不大大方方地把他们public呢?

何苦玩弄这些无聊的技巧,和自己过不去?
netsbull 2001-11-07
  • 打赏
  • 举报
回复
同意up,封装是概念上的保护,是设计思想的东西,目的并不是内存一级的保护.
chxr 2001-11-07
  • 打赏
  • 举报
回复
类的封装是为了在做工程的时候利用编译器的功能。能够明确的指出那些可用
那些不可用。当然这个可用不可用并不是绝对的。你如果是自己直接去取。
那就失去了封装的意思。说的彻底点。对象总是存在内存当中。在自己的进程下
当然可以访问到所有的内存。照你这么说那用类封装写好的程式就不能直接访问内存了么?呵呵
勉励前行 2001-11-07
  • 打赏
  • 举报
回复
我想是,有可能,但不能保証,每個C/C++編譯器對對象在內存的布局可以不一樣,你可以那樣做,不過不知會產生什么后果。
bdsc 2001-11-07
  • 打赏
  • 举报
回复
head 文件是谁给你的,给你的版本是不是处理过的?关于代码安全是另外一回事。(ms的MFC类中一些成员变量和方法是没有公布的)

我觉得封装的意义是划清界限,让你在开发的时候不用(能)考虑一些东西,是跟设计有关的。也就是说private的意思是"请不要考虑我",而不是"我是秘密,想办法来搞我".

yrdyrdsyr 2001-11-07
  • 打赏
  • 举报
回复
chxr,不是说输出的不对,而是可以改变原来私有对象的值啊
bdsc,我是新手,没有对封装有很深的理解,但是如果被人能很方便的访问私有数据,那封装还有用吗?我指只要拿到头文件,看到私有变量的声明就能猜出了,不知对否,请教
bdsc 2001-11-06
  • 打赏
  • 举报
回复

所有的程序都是机器码
实际中,你有可能猜到对象的结构,但成功几率,要想搞不容易?
你认为的封装是什么意思?
chxr 2001-11-06
  • 打赏
  • 举报
回复
你这个可能有问题。据我知道。含有虚函数对象的首地址是VPTR。不是直接的数据。
如果你是想问为什么输出的不对。那我建议你把virtual去掉试试
或许可以。如果还不行。那你或许可以看看在对象的地址里面到底偏移多少
才是你要的数据。不过这样做没什么意思。。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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