这篇文章主要介绍怎么通过指针突破c++类的访问权限,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
看如下代码
# include “pch.h" # include & lt; iostream> using namespace 性传播疾病;class A {公众:,(int ,, int b, int C),: m_a (A),, m_b (b), m_c (C),{};私人:,int m_a,, m_b, m_c,}, int 主要(){obj, A  (, 1,, 2,, 3);, int A =, obj.m_a;,//Compile error A * p =, new (3、4、5);, int b =, p→m_b;,,//不可访问}
因为一个中的m_a和m_b是私人的,所以不能访问。
但这只是语法层面上的不可访问,我们任然可以通过指针访问类中的私有和保护。
假设对象obj的内存模型为:
起始地址为0 x1000,因为都为int整数类型,所以m_a, m_b, m_c都相距4个字节,所以起始地址+他们相距的字节数,就可以访问到成员变量的地址。
若m_b是公共类型,则
int b=p→m_b;
是正确的,此时编译器在内部的转换为:int b=* (int *) ((int) p + sizeof (int));
1. p是指向对象obj的指针
2。(int) p将指针转化为int类型进行加法运算
3. sizeof (int)是int占据的字节长度,用来计算m_b的偏移量
4。(int) p + sizeof (int)得到的就是m_b的地址,但此时是int类型,所以通过(int *)强制转换为int *类型
5。开头的*是为了获取地址上的数据
如此一来,上面错误的代码可写为:
int=* (int *)(和obj); int b=* (int *) ((int) p + sizeof (int));/* - - - - - - -访问变量m_c - - - - - - - - - - */int c=* (int *) ((int) p + sizeof (int) * 2),
这样就可以突破访问限制了(其他类型类似)
以上是“怎么通过指针突破c++类的访问权限”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!