1. 程式人生 > 程式設計 >如何通過指標突破C++類的訪問許可權

如何通過指標突破C++類的訪問許可權

看如下程式碼

#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的記憶體模型為:

如何通過指標突破C++類的訪問許可權

起始地址為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.開頭的*是為了獲取地址上的資料

如此一來,上面錯誤的程式碼可寫為:

int a = *(int*)(&obj);
int b = *(int*)( (int)p + sizeof(int) );
/*-------訪問變數m_c--------*/
int c =*(int*)( (int)p + sizeof(int)*2 );

這樣就可以突破訪問限制了(其他型別類似)

總結

以上所述是小編給大家介紹的如何通過指標突破C++類的訪問許可權,希望對大家有所幫助!