Категорически не согласен.В других методов для этого надо было бы создавать полностью новый класс, заполнять с нуля все его переменные и методы(включая cHelmet::Equip())
Во-первых (рассматриваю метод 3), класс будет один, TArmor, различается только переменная Slot.
Во-вторых, допустим в учебных целях, что это все-таки два разных класса. Тогда надо грамотно использовать наследование. Наследуем оба класса от TWearable с методом Equip, объявляем в TWearable абстрактную функцию GetSlot, переопределяем ее в потомках. Собственно, если это единственное отличие шлема от сапогов, то больше НИЧЕГО в этом классе переопределять не придется, все унаследовано от TWearable.
Вот только новый для добавляемого предмета код надо будет не дописывать новые пункты в switch в десятке мест, а объявить новый класс в отдельном модуле и всю специфику предмета реализовывать в нем.код в любом случае разрастётся, в остальных случаях за счёт других классов.
Имхо первый метод приемлем если заранее известны все предметы и не планируется ничего добавлять или усложнять. Какой-нибудь 7DRL. Потому что иначе все эти switch могут превратиться в безумие. Например - вводим новый предмет, платок. Его можно надевать и на голову и на руку. Получается придется делать еще проверки, если не занята нолова - на голову надеваем, иначе на руку (все это в той же функции equip), потом еще дополнительные проверки для двуручного оружия. Все это несложно написать, но вот прочитать будет все сложнее.