刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

ポインタ問題言い訳編

g++、vc++で再現できなかったので、わけわかんね。
俺が現象を見た時はただ単純にコンパイラのバグだったのかね(←ここらが言い訳)。

以下コード。vc++とg++で確認。

class Base{
public:
virtual void baseFunc(void){}
};

class HiddenBase{
public:
virtual void hiddenBaseFunc(void){}
};

class Derived : public Base, public HiddenBase{
};

int main(int argc, char** argv){
HiddenBase* hiddenBase;
Base* base;
Derived* derived;

derived = new Derived();
base = derived;
hiddenBase = derived;

printf("%p %p %p\n",derived, base, hiddenBase);

printf("%d\n", derived==base);
printf("%d\n", derived==hiddenBase);

return 0;
}

みりゃ分かるんだが、derived、base、hiddenBaseのアドレスは一致しない。
ただ、vc++とg++はコンパイラが賢いから比較の際にはちゃんとオフセットを考慮して比較してくれてるので==の結果は人間様の意図を汲み取ってくださいます。というか、修正してくれないのが多分おかしい。

俺がこれではまった時は何故==でうまくいかなかったんだろうか?意味も無くvoid*とかにキャストしてから比較してたのか?