次のコードを参照してください。
1つの#include " pch.h " 2の#include <iostreamの> 3 4 使用して 名前空間STDを、 5 6 クラスA { 7 公共: 8 A(int型、int型、B、C INT):m_a()、M_B(B)、m_c(C){}。 9 10 プライベート: 11 int型m_a、M_B、m_c。 12 }。 13 14 のint main()の 15 { 16 AのOBJ(1、2、3 )。 17 INTobj.m_a = A; // コンパイルエラー 18は、 A * = P 新しい新しい(A 3、4,5 ); 19 int型 B = P-> M_B; // アクセスできない 20 }
Aはm_aとM_Bあるのでプライベートなので、それがアクセスすることはできません。
これが唯一のアクセスできない文法レベルである。しかし、我々は、アクセスクラスへのポインタがプライベートで保護されたいずれかのことができます。
オブジェクトOBJメモリモデルと仮定すると:
開始アドレスはとしてm_a、M_Bので、m_cは、あなたが変数のアドレスにアクセスすることができます離れてそれらのバイトのアドレス+番号を開始、4つのバイトで区切られ、int型の整数であり、0x1000番地です。
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はM_Bアドレス(INT)P +はsizeof(INT)が得られたが、この時間は、int型のものであるので、型intに(INT *)キャストによってです*
*初めはアドレスにデータを取得することです
このように、上記のエラーコードは次のように書くことができます。
int型= *(INT *)(&OBJ)。
INT B = *(INT *)((INT)P +はsizeof(INT))。
/ * -------アクセス変数m_c -------- * /
INT = C *(INT *)((INT)P +はsizeof(INT)* 2)。
だから、あなたは(他のタイプと同様に)アクセス制限を突破できること
します。https://blog.csdn.net/sinat_38104725/article/details/98788095より転載