Пока вы проверяли все возможные комбинации факторов времени / переменных / входных данных, конечно. Как упоминалось в комментариях, это было бы похоже на удаление утверждений.
В языке нет ничего, что сделало бы это по сути небезопасным, учитывая необходимые гарантии того, что ваши высказывания всегда будут правильными. Тем не менее, это кажется небезопасным в том смысле, что вы, вероятно, никогда не сделаете такую гарантию.
Обновление
Константин доказал, что при работе с множественным наследованием этот метод будет работать только для одиночных шагов вверх / вниз по дереву наследования 1 .
struct A1 { virtual ~A1() {} };
struct A2 { virtual ~A2() {} };
struct A3 { virtual ~A3() {} };
struct B : A1, A2 {};
struct C : A1, A3, A2 {};
int main() {
A1* a1 = (rand() < RAND_MAX / 2 ? (A1*)new B : (A1*)new C);
A2* p1 = dynamic_cast<A2*>(a1);
// ^ succeeds, but is a cross-cast
// A2* p2 = static_cast<A2*>(a1);
// ^ ill-formed
A2* p3 = static_cast<A2*>(static_cast<B*>(a1));
// ^ must chain, instead.
// but p3 is invalid because we never
// checked that `dynamic_cast<B*>(a1)` is valid.. and it's not
// Instead, let's expand the `dynamic_cast`s into a chain, too:
A2* p3 = dynamic_cast<B*>(a1);
A2* p4 = dynamic_cast<A2>*(a1);
// ^ p3 fails, so we know that we cannot use `static_cast` here
}
Таким образом, вы можете заменить dynamic_cast
s на static_cast
s, если:
- Каждый
dynamic_cast
выполняет только одиночный шаг вверх или вниз;
- Каждый
dynamic_cast
, как известно, всегда добивается успеха.
1 На самом деле это немного упрощает, так как, например, откаты будут работать для любого количества шагов. Но это хорошее правило.