您好,登錄后才能下訂單哦!
這篇文章主要介紹怎么通過指針突破C++類的訪問權(quán)限,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
看如下代碼
#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; //不可訪問}
因?yàn)锳中的m_a和m_b是private,所以不能訪問。
但這只是語法層面上的不可訪問,我們?nèi)稳豢梢酝ㄟ^指針訪問類中的private和protected。
假設(shè)對(duì)象obj的內(nèi)存模型為:
起始地址為0x1000,因?yàn)槎紴閕nt整數(shù)類型,所以m_a、m_b、m_c都相距4個(gè)字節(jié),所以起始地址+他們相距的字節(jié)數(shù),就可以訪問到成員變量的地址。
若m_b是public類型,則
int b = p->m_b;
是正確的,此時(shí)編譯器在內(nèi)部的轉(zhuǎn)換為:int b = *(int*)( (int)p + sizeof(int) );
1.p是指向?qū)ο髈bj的指針
2.(int)p 將指針轉(zhuǎn)化為int類型進(jìn)行加法運(yùn)算
3.sizeof(int)是int占據(jù)的字節(jié)長(zhǎng)度,用來計(jì)算m_b的偏移量
4.(int)p+sizeof(int)得到的就是m_b的地址,但此時(shí)是int類型,所以通過(int*)強(qiáng)制轉(zhuǎn)換為int*類型
5.開頭的*是為了獲取地址上的數(shù)據(jù)
如此一來,上面錯(cuò)誤的代碼可寫為:
int a = *(int*)(&obj);int b = *(int*)( (int)p + sizeof(int) );/*-------訪問變量m_c--------*/int c =*(int*)( (int)p + sizeof(int)*2 );
這樣就可以突破訪問限制了(其他類型類似)
以上是“怎么通過指針突破C++類的訪問權(quán)限”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。