События разных типов обычно содержат очень разные данные и используются по-разному. Я бы сказал, что это плохо подходит для создания подтипов (наследования).
Давайте сначала проясним одну вещь: вам не нужно поле type
в любом случае. В случае наследования вы можете определить подкласс вашего текущего объекта, применив его. При использовании с указателем dynamic_cast
возвращает либо объект правильного подкласса, либо нулевой указатель. На cppreference есть хороший пример . В случае помеченного союза вы действительно должны использовать класс, который представляет помеченное объединение, например std::variant
, вместо того, чтобы иметь type
рядом с объединением в качестве членов вашего класса.
Если бы вы использовали наследование, типичный способ сделать это - поместить ваши события в массив (вектор) из Event
указателей и выполнять действия с ними из интерфейса, предоставляемого классом Event
. Однако, поскольку это события, вы, вероятно, не будете делать то же самое в зависимости от типа события, поэтому вы закончите преобразование текущего объекта Event
в один из подклассов (KeyEvent
) и только потом будете делать что-то с это из интерфейса, предоставляемого подклассом (используйте keyCode
каким-то образом).
Если, однако, вы должны были использовать помеченное объединение или вариант, вы можете напрямую иметь свои Event
объекты в массиве, и не придется иметь дело с указателями и понижением. Конечно, вы можете потратить впустую некоторое количество памяти, но насколько велики ваши классы событий? Кроме того, вы можете повысить производительность только потому, что объекты Event
расположены близко друг к другу в памяти, в дополнение к тому, что вам не нужно разыменовать указатели.
Опять же, я бы сказал, что вариант лучше подходит для ситуации, чем подтипы, потому что события разных типов обычно используются по-разному. Например, KeyEvent
имеет связанный ключ («код клавиши») среди сотен и не имеет позиции, тогда как MouseEvent
имеет связанную кнопку из трех, может быть, пяти, но не намного больше, а также позицию. Я не могу придумать общего поведения между ними, кроме очень общих вещей, таких как временная метка или какое окно получает событие.