作者chchwy (mat)
看板C_and_CPP
標題[問題] Effective C++ Item 27 問題重現
時間Thu Jan 20 22:22:55 2011
問題(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
→ 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)