В моем коде есть что-то похожее:
#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 просто причудливым, или он придерживается стандарта? Я пропустил что-то жизненно важное здесь?