Re: [問題] 奇怪的pointer assign問題...

看板Programming作者時間18年前 (2006/06/24 07:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
※ 引述《kafy.bbs@ptt.cc (殺破狼...殺~~~)》之銘言: > : class D3DXFRAME {...}; > : class D3DXFRAME_EX : public D3DXFRAME { ... }; > : D3DXFRAME_EX *testptr1 = new D3DXFRAME_EX; > : D3DXFRAME *testptr2 = NULL; > : testptr2 = testptr1; > : 假設testptr1 new出來的值是0x00d01530 > : 在assign給testptr2的時候居然自動加4了, > : 也就是testptr1 assign給testptr2的是0x00d01534 > 我測試了一下,修改正確了,大概知道為什麼 > 原本的D3DXFRAME算是Struct物件,裡面的定義只有很單純的member variable而已, > 但是D3DXFRAME_EX我定義成class,而裡面的deconstructor是virtual的, > 讓D3DXFRAME_EX變成virtual class, > 所以多了一個隱形的member variable, __vfptr > 指標向上轉型導致父類別field的起始位址與子類別的起始位址不同所照成的, > 我把virtual這個modifier拿掉就可簡單的解決問題, > 可是有沒有不用拿掉的作法呢? 這個問題的根本在於你既然用上了繼承, 為什麼還要這麼去關心 address 是多少這件事呢? 反正起始位址是多少並不重要, 重要的是在執行 testptr2->xxxx 的時候, 確實也能拿到正確的 data member 就好了, 而這一點 compiler 會幫你確保, 你沒有必要去擔憂, 除非你在後面還寫了一堆語言本身就沒有定義會發生什麼事的動作。 -- Name: Tseng, Ling-hua E-mail Address: uranus@it.muds.net School: National Chung Cheng University Department: Computer Science and Information Engineering Researching: Porting GCC and Implementing VLIW instruction scheduler in GCC Homepage: https://it.muds.net/~uranus -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:218-171-147-15.dynamic.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩
文章代碼(AID): #14d7Ak00 (Programming)
文章代碼(AID): #14d7Ak00 (Programming)