Лично я считаю, что на этот вопрос следует ответить скорее как вопрос дизайна, а не как вопрос технологии.
Я бы спросил: «Какой смысл был защищенный метод в первую очередь?» Был ли это метод, который должны вызывать только подклассы, или это метод, который подклассы должны переопределять? Тем не менее, это может быть метод, который не ожидается в общем базовом классе, но может ожидаться в подклассе. Клиенту базового класса они никогда не знали об этом защищенном методе. Создатель подкласса решил расширить контракт, и теперь этот защищенный метод является общедоступным. Вопрос должен быть не в том, позволяет ли это C ++, а в том, подходит ли вам класс, контракт и будущие сопровождающие. Конечно, это может быть неприятный запах, но на самом деле вам нужно сделать это правильно для соответствующего варианта использования.
Если вы сделаете защищенный метод общедоступным, убедитесь, что вы правильно предоставили внутреннюю документацию для сопровождающего, объясняющую обоснование того, почему именно это решение принято.
В целом, хотя в целях безопасности, как упоминалось ранее, вы, вероятно, захотите использовать функцию делегата (с другим именем) в подклассе. Таким образом, вместо «get (int)» вы можете использовать «getAtIndex (int)» или что-то в этом роде. Это позволяет вам легче рефакторинг / защита / аннотация / документ, что в будущем.