C 突破private訪問許可權的黑科技

2021-09-16 19:07:16 字數 1098 閱讀 8237

如何突破class的private屬性限制——試圖破壞class的封裝性,有點「逆天而行」的感覺。

#includeusing namespace std;

class x

templatevoid func(const t &t){}

const int getvalue()

friend void func(x* xptr);

};void func(x* xptr)

int main()

使用友元函式,應該是最先想到的解決方案。

類的友元函式是定義在類外部,但有權訪問類的所有私有(private)成員和保護(protected)成員。

#includeusing namespace std;

class x

templatevoid func(const t &t){}

const int getvalue() };

// 同x的記憶體布局,將變數的型別定義改為public

class y

;void func(x* xptr)

int main()

首先我們將x型別的指標轉換為y型別的指標,在編譯器看來,我們訪問的是y型別的public成員m_age,因此編譯通過,然而事實上該指標是x型別的,由於y跟x的記憶體布局是完全一樣,因此訪問y的m_age成員實際上也就是在訪問x的m_age成員。

關於類的記憶體布局,有興趣的可以看這裡:

如果x中存在乙個成員模板,那麼可以這樣子:

#includeusing namespace std;

class x

templatevoid func(const t &t){}

const int getvalue() };

struct y {};

template<>

void x::func(const y&) //特化

int main()

這種方法利用了x具有乙個成員模板的事實,通過特化函式模板,來打入敵人內部。**完全符合標準,標準也確保這種行為會按照編碼者的意圖行事。boost和loki中大量運用此手法。

C 突破private訪問許可權的黑科技

昨天,有位同事丟擲了乙個問題 乙個class內有乙個private屬性的struct型別,然後他想做的事情是,在繼承該class的子類中復用這個型別,但是由於該類似的private屬性,編譯是不通過的。因此就引入了乙個問題 如何突破class的private屬性限制 試圖破壞class的封裝性,有點...

突破訪問許可權

我們在寫 的時候,按約定都是把成員資料放到private訪問區中,然後在通過相應的函式來訪問。那又有什麼樣的 可以突破訪問許可權來直接操作類中private區段中的成員資料呢?首先,我們想到了指標,對吧 指標可是萬能之王,然而也是萬惡之源。那我們就先來看看指標如何突破馬其諾防線的。先定義乙個測試類 ...

建構函式 訪問許可權private

一 建構函式 具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫parent construct 如果子類沒有定義建構函式則會如同乙個普通的類方法一樣從...