2013-05-28 199 views
4

我有一個基本的C++問題,很不幸讓我困惑。最近我遇到了一篇文章,該文章使用向下轉換來訪問班級的私人成員。我的問題是爲什麼它的工作?訪問C++父類的私有成員

考慮到我有型虛擬的私有成員M_P *父P級則採用的方法是創建一個黑客類hackP如下:

class hackP: public P { 
public: 
dummy *m_p; 
}; 

這顯然獲得了對class P私有成員訪問m_p使用類似

P parent = ...; 
hackP *hp = (hackP*)&parent; 
// access parent m_p as hp->m_p 

任何幫助,將不勝感激。

+0

嗯,m_p是公開的嗎?什麼是黑客? –

+0

@MichaelDorgan:它在'hackP'中公開,但可能佔用與'P'中的私有相同的偏移量。這就是破解。 –

+0

明白了。謝謝。 –

回答

5

它看起來像GotW #76Uses and Abuses of Access Rights涵蓋了這個話題非常好,我不得不說,我拿起了一些我從它不知道有趣的tid位。

這篇文章Access to private members. That's easy!需要更多的努力來包裝你的頭,但似乎更靈活。

answer從這個線程Is private member hacking defined behaviour?這是非常相似但不完全相同似乎表明這是不確定的行爲,因爲佈局就不能保證是access-qualifier部分之間是相同的。從draft C++ standard,部分9.2類成員說(重點煤礦):一個(非工會)的

非靜態數據成員的類與同一接入 控制(第11),後來分配等等成員有更高的 地址在一個類對象內。 具有不同訪問控制的非靜態 數據成員的分配順序未指定(11)。

+0

參考GotW#76和私人會員黑客定義的行爲非常感謝。後者尤其如此。我只需要用我的編譯器嘗試一下,看看會發生什麼,因爲我正在使用提供的DLL並且無法重新編譯它。謝謝回覆。 –