私のコードにはこれに似たものがあります:
#include <iostream>
#include <cstdlib>
struct Base
{
virtual int Virtual() = 0;
};
struct Child
{
struct : public Base
{
virtual int Virtual() { return 1; }
} First;
struct : public Base
{
virtual int Virtual() { return 2; }
} Second;
};
int main()
{
Child child;
printf("ble: %i\n", ((Base*)&child.First)->Virtual());
printf("ble: %i\n", ((Base*)&child.Second)->Virtual());
system("PAUSE");
return 0;
}
これにより、次の出力が得られると予想されます。
ble: 1
ble: 2
GCC(3.4.5だと思います)でコンパイルすると、そうなります。
ただし、これを Visual Studio 2008 でコンパイルして実行すると、次のようになります。
ble: 2
ble: 2
興味深いのは、Base から派生した構造体に名前 ( struct s1 : public Base
) を付けると、正しく動作することです。
あるとすれば、どの動作が正しいですか? VS は単純なだけですか、それとも標準に準拠していますか? ここで重要な何かが欠けていますか?