這篇文章將為大家詳細(xì)講解有關(guān)怎樣通過指針突破C++類的訪問權(quán)限,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司一直秉承“誠信做人,踏實做事”的原則,不欺瞞客戶,是我們最起碼的底線! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個客戶多一個朋友!專注中小微企業(yè)官網(wǎng)定制,做網(wǎng)站、成都做網(wǎng)站,塑造企業(yè)網(wǎng)絡(luò)形象打造互聯(lián)網(wǎng)企業(yè)效應(yīng)。
看如下代碼
#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,所以不能訪問。
但這只是語法層面上的不可訪問,我們?nèi)稳豢梢酝ㄟ^指針訪問類中的private和protected。
假設(shè)對象obj的內(nèi)存模型為:
起始地址為0x1000,因為都為int整數(shù)類型,所以m_a、m_b、m_c都相距4個字節(jié),所以起始地址+他們相距的字節(jié)數(shù),就可以訪問到成員變量的地址。
若m_b是public類型,則
int b = p->m_b;
是正確的,此時編譯器在內(nèi)部的轉(zhuǎn)換為:int b = *(int*)( (int)p + sizeof(int) );
1.p是指向?qū)ο髈bj的指針
2.(int)p 將指針轉(zhuǎn)化為int類型進行加法運算
3.sizeof(int)是int占據(jù)的字節(jié)長度,用來計算m_b的偏移量
4.(int)p+sizeof(int)得到的就是m_b的地址,但此時是int類型,所以通過(int*)強制轉(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 );
這樣就可以突破訪問限制了(其他類型類似)
關(guān)于“怎樣通過指針突破C++類的訪問權(quán)限”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
分享題目:怎樣通過指針突破C++類的訪問權(quán)限
地址分享:http://jinyejixie.com/article32/jjjcpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護、Google、動態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計、企業(yè)網(wǎng)站制作、移動網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)