[問題] Effective C++ Item 27 問題重現

看板C_and_CPP (C/C++)作者 (mat)時間15年前 (2011/01/20 22:23), 編輯推噓2(205)
留言7則, 4人參與, 最新討論串1/1
問題(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

01/20 22:38, , 1F
讓 Derived 多重繼承然後 cast 成不同的 base 應該就會出現
01/20 22:38, 1F

01/20 22:42, , 2F

01/20 23:33, , 3F
阿 真的耶,感謝樓上。
01/20 23:33, 3F

01/20 23:35, , 4F
第一次看到這個條款也嚇到 沒想到會有這種情況
01/20 23:35, 4F
※ 編輯: chchwy 來自: 114.45.102.54 (01/21 01:16)

01/21 04:15, , 5F
這東西好玩的地方在於,你拿 base 跟 derived 的 pointer
01/21 04:15, 5F

01/21 04:16, , 6F
用 == 去比較,結果還是正常。但是如果你直接 cast 成
01/21 04:16, 6F

01/21 04:16, , 7F
long 存起來,就可能出現悲劇,以前抓過這種很智障的 bug
01/21 04:16, 7F
※ 編輯: chchwy 來自: 114.45.107.45 (09/13 16:00)
文章代碼(AID): #1DE4L7IT (C_and_CPP)
文章代碼(AID): #1DE4L7IT (C_and_CPP)