看板 C_and_CPP 關於我們 聯絡資訊
問題(Question): 最近在讀Effective C++ 第三版 侯老大翻譯的版本 條款27,裡面有一段話讓我非常震驚,節錄如下 === class Base { ... }; class Derived: public Base { ... }; Derived d; Base *pb = &d; // implicitly convert Derived* → Base* 這裡我們只是創建了一個指向一個 derived class object(派生類物件)的 base class pointer(基類指標),但是有時候,這兩個指標的值並不相同。 在這種情況下,會在運行時在 Derived* 指標上應用一個偏移量以得到正確的 Base* 指標值。 === 我試著想要重現問題,看看pb的型態是不是真的會影響指標位址, 可是試不出來,我不管怎麼轉型這個指標的值都一樣阿。 不知道是不是compiler的關係? (我用gcc) 有沒有人能重現過這個問題呢? 先謝謝囉 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.158.103
scwg:讓 Derived 多重繼承然後 cast 成不同的 base 應該就會出現 01/20 22:38
scwg: http://nopaste.csie.org/0508e 01/20 22:42
chchwy:阿 真的耶,感謝樓上。 01/20 23:33
james732:第一次看到這個條款也嚇到 沒想到會有這種情況 01/20 23:35
※ 編輯: chchwy 來自: 114.45.102.54 (01/21 01:16)
tinlans:這東西好玩的地方在於,你拿 base 跟 derived 的 pointer 01/21 04:15
tinlans:用 == 去比較,結果還是正常。但是如果你直接 cast 成 01/21 04:16
tinlans:long 存起來,就可能出現悲劇,以前抓過這種很智障的 bug 01/21 04:16
※ 編輯: chchwy 來自: 114.45.107.45 (09/13 16:00)