最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何通過(guò)指針突破C++類的訪問(wèn)權(quán)限

 更新時(shí)間:2020年02月11日 09:46:41   作者:余~年  
這篇文章主要介紹了通過(guò)指針突破C++類的訪問(wèn)權(quán)限,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(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; //不可訪問(wèn)
}

因?yàn)锳中的m_a和m_b是private,所以不能訪問(wèn)。

但這只是語(yǔ)法層面上的不可訪問(wèn),我們?nèi)稳豢梢酝ㄟ^(guò)指針訪問(wèn)類中的private和protected。

假設(shè)對(duì)象obj的內(nèi)存模型為:

起始地址為0x1000,因?yàn)槎紴閕nt整數(shù)類型,所以m_a、m_b、m_c都相距4個(gè)字節(jié),所以起始地址+他們相距的字節(jié)數(shù),就可以訪問(wèn)到成員變量的地址。

若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)度,用來(lái)計(jì)算m_b的偏移量

4.(int)p+sizeof(int)得到的就是m_b的地址,但此時(shí)是int類型,所以通過(guò)(int*)強(qiáng)制轉(zhuǎn)換為int*類型

5.開(kāi)頭的*是為了獲取地址上的數(shù)據(jù)

如此一來(lái),上面錯(cuò)誤的代碼可寫(xiě)為:

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

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

總結(jié)

以上所述是小編給大家介紹的如何通過(guò)指針突破C++類的訪問(wèn)權(quán)限,希望對(duì)大家有所幫助!

相關(guān)文章

最新評(píng)論

吐鲁番市| 苏尼特右旗| 淮北市| 红桥区| 金堂县| 定襄县| 南昌县| 巴马| 大兴区| 饶河县| 通榆县| 徐水县| 抚顺县| 彩票| 河北区| 嘉禾县| 山西省| 延寿县| 廊坊市| 尖扎县| 皮山县| 内黄县| 大同县| 临沂市| 澄江县| 馆陶县| 清丰县| 色达县| 福清市| 崇义县| 千阳县| 焉耆| 旌德县| 西乌| 秦皇岛市| 锡林浩特市| 惠安县| 沛县| 信阳市| 镇巴县| 昆明市|