У меня вопрос о том, чего я до сих пор не понимаю в профсоюзах. Я читал об их использовании и по большей части вижу, чем они могут быть полезны, и понимаю их. Я видел, что они могут обеспечить примитивный полиморфизм в стиле C. Примером этого, который я видел на нескольких веб-сайтах, является объединение событий SDL:
typedef union {
Uint8 type;
SDL_ActiveEvent active;
SDL_KeyboardEvent key;
SDL_MouseMotionEvent motion;
SDL_MouseButtonEvent button;
SDL_JoyAxisEvent jaxis;
SDL_JoyBallEvent jball;
SDL_JoyHatEvent jhat;
SDL_JoyButtonEvent jbutton;
SDL_ResizeEvent resize;
SDL_ExposeEvent expose;
SDL_QuitEvent quit;
SDL_UserEvent user;
SDL_SysWMEvent syswm;
} SDL_Event;
Я не могу понять, как может быть "тип" член там сосуществует с типами событий? Разве им не разрешено существовать только по одному, поскольку они занимают одну и ту же область памяти? Разве объединение не будет существовать в любое время как тип или одно из событий?
Я понимаю, что каждое событие на самом деле является структурой с членом типа, например:
// SDL_MouseButtonEvent
typedef struct{
Uint8 type;
Uint8 button;
Uint8 state;
Uint16 x, y;
} SDL_MouseButtonEvent;
Как это каким-то образом имеет смысл? Позволяет ли это каким-то образом члену типа объединения представлять тип любой структуры, которая в настоящее время является объединением? Это какой-то странный эффект, который происходит, когда каждый член объединения, кроме одного, является структурой, и каждая структура содержит этот один член?
Можно ли получить доступ к элементам структуры, не зная, какой структурой является объект?
Спасибо!