91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎樣通過指針突破C++類的訪問權限

發布時間:2021-02-01 13:46:14 來源:億速云 閱讀:187 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關怎樣通過指針突破C++類的訪問權限,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

看如下代碼

#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,所以不能訪問。

但這只是語法層面上的不可訪問,我們任然可以通過指針訪問類中的private和protected。

假設對象obj的內存模型為:

怎樣通過指針突破C++類的訪問權限

起始地址為0x1000,因為都為int整數類型,所以m_a、m_b、m_c都相距4個字節,所以起始地址+他們相距的字節數,就可以訪問到成員變量的地址。

若m_b是public類型,則

int b = p->m_b;

是正確的,此時編譯器在內部的轉換為:int b = *(int*)( (int)p + sizeof(int) );

1.p是指向對象obj的指針

2.(int)p 將指針轉化為int類型進行加法運算

3.sizeof(int)是int占據的字節長度,用來計算m_b的偏移量

4.(int)p+sizeof(int)得到的就是m_b的地址,但此時是int類型,所以通過(int*)強制轉換為int*類型

5.開頭的*是為了獲取地址上的數據

如此一來,上面錯誤的代碼可寫為:

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

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

關于“怎樣通過指針突破C++類的訪問權限”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

黄山市| 兰西县| 合作市| 安平县| 内丘县| 双流县| 东港市| 九龙坡区| 罗平县| 博乐市| 本溪| 大化| 安化县| 吉林市| 阿尔山市| 林周县| 郧西县| 沈阳市| 新乡市| 丹阳市| 凌云县| 吉林省| 泗洪县| 霍山县| 丹寨县| 循化| 彭州市| 满城县| 盘锦市| 贵港市| 梓潼县| 广安市| 金沙县| 祥云县| 柳河县| 集安市| 哈尔滨市| 内丘县| 三台县| 峡江县| 松阳县|