[問題] 在class外面走後門存取private

看板C_and_CPP (C/C++)作者 (Symphonia)時間14年前 (2012/06/12 01:35), 編輯推噓3(3011)
留言14則, 5人參與, 最新討論串1/1
問題(Question): 在stackoverflow上面看到一個有趣的問題,只是不太了解為什麼可以,想知道原因。 safe.h class safe { int money; public: safe() : money(1000000) { } template <typename T> void backdoor() { // Do some stuff. } }; main.cpp: #include <safe.h> #include <iostream> class key; template <> void safe::backdoor<key>() { // My specialization. money -= 100000; std::cout << money << "\n"; } int main() { safe s; s.backdoor<key>(); s.backdoor<key>(); } Output: 900000 800000 ================================== class A { int a; } class B { public: int b; } union { A a; B b; }; then B * b = reinterpret_cast<B*>(&a); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.249.13

06/12 01:46, , 1F
哪邊不了解@@ 不就是用method來access property嗎?
06/12 01:46, 1F

06/12 02:05, , 2F
第一個money不是safe的private嗎?為什麼backdoor<key>
06/12 02:05, 2F

06/12 02:07, , 3F
可以存取?我不太了解他是怎麼運作的。第二個看不懂@@
06/12 02:07, 3F

06/12 02:07, , 4F
第二個看起來就是把它們兩個記憶體疊在一起...XDDD
06/12 02:07, 4F

06/12 02:09, , 5F
樓上說的沒錯,這是利用union的特性
06/12 02:09, 5F

06/12 02:10, , 6F
指標真是惡魔 ...
06/12 02:10, 6F

06/12 02:13, , 7F
不一個我就不太懂了...
06/12 02:13, 7F

06/12 02:14, , 8F
1.method可以存取任何property, 不管是不是private/public
06/12 02:14, 8F

06/12 02:16, , 9F
2.backdoor<key>是safe的一個method, 所以可以存取money..
06/12 02:16, 9F

06/12 02:21, , 10F
第二個還真讓人想了一下..
06/12 02:21, 10F

06/12 02:21, , 11F
backdoor<key>是特化的template method, 可以查查看"特化"
06/12 02:21, 11F

06/12 02:23, , 12F
謝謝,我先去查一下資料看看
06/12 02:23, 12F

06/12 02:28, , 13F
那個class key的key在那?怎麼沒看到?
06/12 02:28, 13F

06/12 02:32, , 14F
在main.cpp下面幾行阿
06/12 02:32, 14F
文章代碼(AID): #1FrYnhcb (C_and_CPP)
文章代碼(AID): #1FrYnhcb (C_and_CPP)