看板Programming
标 题Re: [问题] 奇怪的pointer assign问题...
发信站政大狂狷年少 (Sat Jun 24 06:39:08 2006)
转信站ptt!ctu-reader!ctu-gate!news.nctu!news.ntu!news.ee.ttu!news.cis.nctu!n
※ 引述《[email protected] (杀破狼...杀~~~)》之铭言:
> : 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:
[email protected]
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"的狂狷不驯;属於年少的轻狂色彩 ◎