怎么通过指针突破c++类的访问权限

介绍

这篇文章主要介绍怎么通过指针突破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++类的访问权限”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

怎么通过指针突破c++类的访问权限