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