看如下代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#include "pch.h" #include <iostream> using namespace std; class A { public : A( int a, int b, int c) :m_a(a), m_b(b),m_c(c) {}; private : int m_a, m_b,m_c; }; int main() { A obj( 1, 2, 3); int a = obj.m_a; //Compile error A *p = new A(3,4,5); int b = p->m_b; //不可訪問 } |
因為A中的m_a和m_b是private,所以不能訪問。
但這只是語法層面上的不可訪問,我們任然可以通過指針訪問類中的private和protected。
假設對象obj的內存模型為:
起始地址為0x1000,因為都為int整數類型,所以m_a、m_b、m_c都相距4個字節,所以起始地址+他們相距的字節數,就可以訪問到成員變量的地址。
若m_b是public類型,則
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.開頭的*是為了獲取地址上的數據
如此一來,上面錯誤的代碼可寫為:
1
2
3
4
|
int a = *( int *)(&obj); int b = *( int *)( ( int )p + sizeof ( int ) ); /*-------訪問變量m_c--------*/ int c =*( int *)( ( int )p + sizeof ( int )*2 ); |
這樣就可以突破訪問限制了(其他類型類似)
總結
以上所述是小編給大家介紹的如何通過指針突破C++類的訪問權限,希望對大家有所幫助!
原文鏈接:https://www.cnblogs.com/ArrowToLanguage/p/12287833.html?utm_source=tuicool&utm_medium=referral