Upcasting - это технический инструмент.
Как и любой инструмент, он полезен при правильном использовании и опасен / невыгоден при непоследовательном использовании.
Это может быть хорошо или плохо в зависимости от того, насколько «чистым» вы хотите, чтобы ваш код соответствовал заданной парадигме программирования.
Теперь C ++ не обязательно является «чистым ООП», не обязательно «чистым универсальным», не обязательно «чистым функционалом». А поскольку C ++ является «прагматичным языком», в общем случае преимущество не в том, чтобы он соответствовал «единственной парадигме».
Единственное, что можно сказать технически, это то, что
- Производный класс - это базовый класс плюс нечто большее
- Обращение к производному через базовый указатель делает это «что-то большее» недоступным, если в базе нет механизма, позволяющего вам перейти в производную область.
- Механизм, который C ++ предлагает для этого неявный переход - это виртуальные функции.
- Механизм, который C ++ предлагает для явного перехода , равен
dynamic_cast
(используется при понижении рейтинга).
- Для неполиморфных объектов (у которых нет виртуальных методов)
static_cast
(для downcast) все еще доступно, но без проверки во время выполнения.
Преимущества и недостатки вытекают из последовательного и непоследовательного использования всех этих точек вместе. Это не вопрос, связанный только с понижением.