多重継承したクラスの基底クラス型を指すポインタの意外な挙動


class X {};

class Y {};

class XY : public X, public Y {};


XY* orig = new XY();
...
X* xp = orig;
0040107C mov ecx,dword ptr [orig]
0040107F mov dword ptr [xp],ecx
Y* yp = orig;
00401082 cmp dword ptr [orig],0
00401086 je test22+73h (401093h)
00401088 mov edx,dword ptr [orig]
0040108B add edx,4
0040108E mov dword ptr [ebp-28h],edx
00401091 jmp test22+7Ah (40109Ah)
00401093 mov dword ptr [ebp-28h],0
0040109A mov eax,dword ptr [ebp-28h]
0040109D mov dword ptr [yp],eax
X*とY*とで同じ値を代入しているもんだろうと普通は考えてしまうけども、全然違ってくるのね。
これのせいで Y** ypp = (Y**)&orig と無理矢理やっていたところが、インスタンス化するクラスを多重継承にした途端にyppから辿って適切なメソッドを呼び出すことができなくなっていた。