динамическое приведение — при проектировании C ++ dynamic_cast также проверяется указатель или ссылочный тип

Когда мы делаем динамическое приведение:

A* x = ...;
B* b = dynamic_cast<B*>(x);

Dynamic_cast вернет действительный указатель, только когда:

  1. A является полиморфным, иначе компиляция не удалась.
  2. B эквивалентен A или является производным от A B должен иметь отношение с A в иерархии наследования (хотя я не уверен в стратегии), в противном случае возвращает nullptr. Это обновляется в соответствии с комментариями.
  3. RTTI * x показывает, что это объект класса B или производный класс B, в противном случае возвращает nullptr.

Я рассматриваю случай, когда выполняются как условие 1, так и условие 3, кроме условия 2. Это может быть возможно из-за копирования в память или reinterpret_cast и т. Д. Все последующие обсуждения основаны на этом сценарии.

Один маленький пример здесь: http://ideone.com/tBctgT

Могу ли я сказать, что: если бы в такой ситуации C ++ позволил динамическому успешному запуску динамического вещания, было бы все еще безопасно использовать указатель, возвращенный динамическим динамическим вещанием? Если так, почему стандарт C ++ определяет, что проверка условия 2 является обязательной?

Кроме того, условие 2 можно проверить во время компиляции. Почему стандарт C ++ определяет возвращать nullptr во время выполнения вместо того, чтобы выдавать ошибку компиляции, если это не считается правильной операцией?

1

Решение

Я думаю, что пример является самым простым здесь:

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,

1

Другие решения


По вопросам рекламы [email protected]