如何通過指針突破C++類的訪問權(quán)限
看如下代碼
#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è)對象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é)長度,用來計(jì)算m_b的偏移量
4.(int)p+sizeof(int)得到的就是m_b的地址,但此時(shí)是int類型,所以通過(int*)強(qiáng)制轉(zhuǎn)換為int*類型
5.開頭的*是為了獲取地址上的數(shù)據(jù)
如此一來,上面錯誤的代碼可寫為:
int a = *(int*)(&obj); int b = *(int*)( (int)p + sizeof(int) ); /*-------訪問變量m_c--------*/ int c =*(int*)( (int)p + sizeof(int)*2 );
這樣就可以突破訪問限制了(其他類型類似)
總結(jié)
以上所述是小編給大家介紹的如何通過指針突破C++類的訪問權(quán)限,希望對大家有所幫助!
相關(guān)文章
C++使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac
mp4的音頻流通常是aac編碼,我們做音視頻采集的時(shí)候就需要將,采集的音頻PCM編碼成aac,本文就來為大家介紹一下C++如何使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac吧2023-11-11Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析
這篇文章主要介紹了Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析,有助于更加直觀的理解Object-C常用的結(jié)構(gòu)體,需要的朋友可以參考下2014-07-07C語言修煉之路數(shù)據(jù)類型悟正法?解析存儲定風(fēng)魔上篇
使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-02-02C語言編程gcc如何生成靜態(tài)庫.a和動態(tài)庫.so示例詳解
本文主要敘述了gcc如何生成靜態(tài)庫(.a)和動態(tài)庫(.so),幫助我們更好的進(jìn)行嵌入式編程。因?yàn)橛行r(shí)候,涉及安全,所以可能會提供靜態(tài)庫或動態(tài)庫供我們使用2021-10-10