鱼C论坛

 找回密码
 立即注册
查看: 1852|回复: 9

[技术交流] 子类如何通过指针访问父类私有成员

[复制链接]
发表于 2020-8-11 13:07:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 爱学习520 于 2020-8-11 16:31 编辑

99%的书上和老师都说子类不能访问父类私有成员,真的吗?程序告诉你这都是扯谈,所谓的不能访问,只是编译器层面的规则导致不能访问,我用指针绕开编译器不就行了。
所以下次再说不能访问,加个前提,是编译器规则导致不能访问,不能误人子弟


所以,学习一门语言,实际上本质就是在学编译器的规则,编译器规定你不能这样访问是为了更好的实现封装,实现语言特新。但是,有时候应该看看编译器是怎么工作的会更好的理解并学好一门语言,上面的地址访问方式本质就是编译器的实现方式,用地址,大家可以去看看反汇编代码就知道了,我是看的反汇编代码才知道编译器底层是这样做的
)Q(BV6$)3F`T}7LVYN)$I19.png

评分

参与人数 1荣誉 +2 鱼币 +3 贡献 +3 收起 理由
zltzlt + 2 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-11 13:11:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-11 13:51:40 | 显示全部楼层
是编译器规则导致不能访问,不能误人子弟
抱歉,这是语言规定,而且你的方法也不一定行得通。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-11 14:11:12 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-11 13:51
抱歉,这是语言规定,而且你的方法也不一定行得通。

我上面是说了编译器的规则呀,高级语言就是适应编译器的规则呀,所以从这个角度来说是正确的,规定不能访问。第二个你说方法不一定行得通,那实际案例说。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 14:26:27 | 显示全部楼层
好的代码要可读性好,可维护性好,可移植性好,而不是玩奇技淫巧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-11 14:32:27 | 显示全部楼层
xieglt 发表于 2020-8-11 14:26
好的代码要可读性好,可维护性好,可移植性好,而不是玩奇技淫巧。

你和我说的都不是一个层面的东西,我没有说这样写代码,说的是学一门语言应该看看底层是这么做的,这实际上就是编译器的底层实现,我不相信一个人明白编译器是怎么做的,还学不好或者说学不透C++的本质。所以我说的是一种学习角度,而你说的是使用角度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 14:59:24 | 显示全部楼层
爱学习520 发表于 2020-8-11 14:11
我上面是说了编译器的规则呀,高级语言就是适应编译器的规则呀,所以从这个角度来说是正确的,规定不能访 ...
高级语言就是适应编译器的规则
因果关系错误。编译器规则适应高级语言。

我用位域你怎么办?内存对齐怎么办?
https://blog.csdn.net/yu132563/article/details/83504120
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-11 15:21:21 | 显示全部楼层
本帖最后由 爱学习520 于 2020-8-11 15:28 编辑
永恒的蓝色梦想 发表于 2020-8-11 14:59
因果关系错误。编译器规则适应高级语言。

我用位域你怎么办?内存对齐怎么办?
https://blog.csdn. ...


你这个对齐的问题挺好的。其实也好解决,对齐规则,比如像上面结构体,取成员变量最大的那个字节对齐,比如char、int,那编译器会给char分配实际四个字节,所以在加地址的时候,char这块就得+4后才能访问到接下来的int,不能像上面那样+1.当然,除了你说的字节对齐外,还有其他问题,比如并不是所有机器int都是4个字节等等。所以,还是我上面说的那句话,如果确定当前你所使用的编译器是怎么分配的内存字节的,就一定可以正确访问到。所有,我只是想表达,学习一门语言应该去了解本质,而不是说编译器不能就以为不能,并不是说这样写代码,而是去更好的理解。很多游戏都是C++写的,那么是否可以利用指针去修改游戏运行时的私有数据呢?这不就是一种可以考虑的方式吗,所以,理解本质,我只想表达这个,而帖子最上面表达的,只是想说不要被规则给限制了理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 15:27:19 | 显示全部楼层
爱学习520 发表于 2020-8-11 15:21
你这个对齐的问题挺好的。其实也好解决,对齐规则,比如像上面结构体,取成员变量最大的那个字节对齐, ...

说的不错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-11 15:27:41 | 显示全部楼层
爱学习520 发表于 2020-8-11 15:21
你这个对齐的问题挺好的。其实也好解决,对齐规则,比如像上面结构体,取成员变量最大的那个字节对齐, ...

不。有些编译器还有优化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 07:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表