欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何通過(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)文章

  • C語(yǔ)言單值二叉樹(shù)真題講解

    C語(yǔ)言單值二叉樹(shù)真題講解

    單值二叉樹(shù)你可能之前沒(méi)見(jiàn)過(guò),如果二叉樹(shù)每個(gè)節(jié)點(diǎn)都具有相同的值,那么該二叉樹(shù)就是單值二叉樹(shù),讓我們通過(guò)一個(gè)真題來(lái)深刻了解它吧
    2022-04-04
  • C++this指針詳情

    C++this指針詳情

    這篇文章主要介紹了C++this指針詳情,在 C++ 中,每一個(gè)對(duì)象都能通過(guò) this 指針來(lái)訪問(wèn)自己的地址。this 指針是所有成員函數(shù)的隱含參數(shù)。因此,在成員函數(shù)內(nèi)部,它可以用來(lái)指向調(diào)用對(duì)象,下面我們來(lái)了解更多詳細(xì)內(nèi)容吧
    2022-01-01
  • C語(yǔ)言制作表白神器的示例代碼

    C語(yǔ)言制作表白神器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言制作一個(gè)簡(jiǎn)單的表白神器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-03-03
  • C++使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac

    C++使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac

    mp4的音頻流通常是aac編碼,我們做音視頻采集的時(shí)候就需要將,采集的音頻PCM編碼成aac,本文就來(lái)為大家介紹一下C++如何使用fdk-aac實(shí)現(xiàn)將音頻PCM編碼成aac吧
    2023-11-11
  • 詳解C++中future和promise的使用

    詳解C++中future和promise的使用

    future和promise的作用是在不同線程之間傳遞數(shù)據(jù),這篇文章主要為大家詳細(xì)介紹了C++中future和promise的具體使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • Objective-C中常用的結(jié)構(gòu)體NSRange,NSPoint,NSSize(CGSize),NSRect實(shí)例分析

    Objective-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-07
  • C語(yǔ)言圖書(shū)借閱系統(tǒng)源碼

    C語(yǔ)言圖書(shū)借閱系統(tǒng)源碼

    這篇文章主要為大家分享了C語(yǔ)言圖書(shū)借閱系統(tǒng)源碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C語(yǔ)言中可變參數(shù)的使用方法示例

    C語(yǔ)言中可變參數(shù)的使用方法示例

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中可變參數(shù)的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C語(yǔ)言修煉之路數(shù)據(jù)類型悟正法?解析存儲(chǔ)定風(fēng)魔上篇

    C語(yǔ)言修煉之路數(shù)據(jù)類型悟正法?解析存儲(chǔ)定風(fēng)魔上篇

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2022-02-02
  • C語(yǔ)言編程gcc如何生成靜態(tài)庫(kù).a和動(dòng)態(tài)庫(kù).so示例詳解

    C語(yǔ)言編程gcc如何生成靜態(tài)庫(kù).a和動(dòng)態(tài)庫(kù).so示例詳解

    本文主要敘述了gcc如何生成靜態(tài)庫(kù)(.a)和動(dòng)態(tài)庫(kù)(.so),幫助我們更好的進(jìn)行嵌入式編程。因?yàn)橛行r(shí)候,涉及安全,所以可能會(huì)提供靜態(tài)庫(kù)或動(dòng)態(tài)庫(kù)供我們使用
    2021-10-10

最新評(píng)論