眾所周知,物件導向的語言都會有類似於private,protected,public之類的許可權控制。其實如前一篇blog所講( :在c++中,許可權只是為了在**的執行期阻止獲得變數或者某個函式的位址而達到不能呼叫的作用。言外之意就是只要能搞到記憶體位址,什麼都好說。下面提供幾種hack私有成員變數位址的方法。
1. 計算成員變數記憶體偏移
我相信對c++記憶體分配懂一點的小夥伴都知道這種方法。
class b
std::string getstr()
char* getch()
};int main()
2. 類的等效替換
上面通過計算成員變數的偏移確實可以hack記憶體位址,但是弊端也很明顯成員變數越多,後面就越需要計算偏移,而且二重指標也很容易搞出事情。那麼怎麼辦呢?我們只需要自定義乙個擁有一樣記憶體分布的資料結構即可。
class b
std::string getstr()
char* getch()
};// 在此模擬乙個與class b擁有相同記憶體分布的struct,但許可權都是開放的
typedef
struct
proof;
int main()
3. 元程式設計(meta programming)
之前一直以為元程式設計只有python,js這種動態語言中有,但是沒想到c++的元程式設計也很強大。概念是一樣的,元程式設計(c++操作template,python操作type)的存在都是為了動態生成類。但是我發現乙個問題:c++的模板類中傳遞引數時並不會校驗許可權問題。(比如上面中類b,當我們在執行時使用&b::b獲得偏移時會直接報許可權錯誤,但是在模板中傳參並不會這樣!)
// 這是乙個簡單的類模板傳值的例子
template
typename t f(t)
int main()
那麼如何把類成員位址傳出去呢?原理是相同的。
struct a ;
// tag used to access a::a
struct a_f ;
template
struct rob
};template
struct rob;
int main()
C 中的訪問許可權
private 只能由該類的成員函式,友元函式訪問,不能被該類的物件訪問。protected 除了private外還能被子類的函式訪問,同樣不能被該類的物件訪問。public 除了protected外,還能被該類的物件訪問。private protected public 類的函式和友元函式 子類的...
C 中類訪問許可權控制
c 中類訪問許可權控制 第一 private,public,protected 訪問標號的訪問範圍,在沒有繼承的情況下 private 只能由1.該類中的函式 2.其友元函式訪問。不能被任何其他訪問,該類的物件也不能訪問。protected 可以被1.該類中的函式 2.子類的函式 以及3.其友元函式...
C 類中的訪問許可權問題
2012 05 31 19 48 21 分類 c 基礎的東東 標籤 字型大小 大中小訂閱 c 中public,protected,private訪問小結 第一 private,public,protected方法的訪問範圍.public繼承下 private 只能由該類中的函式 其友元函式訪問,不能...