Союзы, содержащие член типа

У меня вопрос о том, чего я до сих пор не понимаю в профсоюзах. Я читал об их использовании и по большей части вижу, чем они могут быть полезны, и понимаю их. Я видел, что они могут обеспечить примитивный полиморфизм в стиле 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;

Как это каким-то образом имеет смысл? Позволяет ли это каким-то образом члену типа объединения представлять тип любой структуры, которая в настоящее время является объединением? Это какой-то странный эффект, который происходит, когда каждый член объединения, кроме одного, является структурой, и каждая структура содержит этот один член?

Можно ли получить доступ к элементам структуры, не зная, какой структурой является объект?

Спасибо!

7
задан user3386109 16 November 2019 в 07:52
поделиться