Когда мы делаем динамическое приведение:
A* x = ...;
B* b = dynamic_cast<B*>(x);
dynamic_cast вернет действительный указатель только в том случае, если:
- A является полиморфным, иначе компиляция завершится ошибкой.
B эквивалентен A или является производным от AB должен иметь связь с A в иерархии наследования (хотя я не уверен в стратегии), иначе возвращает nullptr. Это обновляется в соответствии с комментариями.- RTTI *x показывает, что это объект класса B или производный класс B, в противном случае возвращает nullptr.
Я рассматриваю случай, когда соблюдаются и условие 1, и условие 3, кроме условия 2. Это может быть возможно из-за копирования памяти или переинтерпретации_приведения и т. д. Все последующие обсуждения основаны на этом сценарии.
Вот небольшой пример: http://ideone.com/tBctgT.
Могу ли я сказать, что: если бы в такой ситуации C++ разрешил успешное выполнение dynamic_cast, было бы безопасно использовать указатель, возвращаемый dynamic_cast? Если да, то почему стандарт С++ определяет, что проверка условия 2 является обязательной?
Кроме того, условие 2 можно проверить во время компиляции. Почему стандарт C++ определяет возврат nullptr во время выполнения вместо выдачи ошибки компиляции, если это не считается правильной операцией?