Фон, который вы не включили - boost имеет polymorphic_cast
в качестве обёртки вокруг dynamic_cast<>
, который выбрасывается при сбое приведения. static_cast<>
хорошо, если вы уверены, что данные относятся к тому типу, к которому вы приводите ... нет проблем с виртуальными членами или без них, и код, который вы включаете, говоря, что он не будет компилироваться, будет компилироваться и выполняться просто отлично, как есть.
Полагаю, вы думаете о возможности случайного приведения к другому производному классу? В этом полезность / опасность литья, не так ли? Вы можете добавить виртуальный деструктор, а затем использовать dynamic_cast <>, так как, строго говоря, RTTI доступен только для типов с одной или несколькими виртуальными функциями.
Код, написанный с использованием static_cast <>, будет по-прежнему безопасно обрабатывать один и тот же тип независимо от внедрения виртуальных функций ... просто если вы начнете передавать этот код другим типам (то есть не CDerived или что-либо публично полученное из них), вы понадобится dynamic_cast <> или другое изменение для предотвращения несовместимых операций.