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

dynamic_cast <new type> (exp)

Я читал в документации, что если новый тип является указателем/ссылкой на производный, а выражение является указателем/ссылкой на базу, то динамическим приведением выполняется только проверка во время выполнения. О чем вообще эти чеки??

Изменить: какие проверки во время выполнения выполняются в боковой трансляции.


person luG_0    schedule 07.06.2018    source источник
comment
Что на самом деле означают эти чеки? - проверка того, что все, что вы переводите в/из, на самом деле является частью одной и той же иерархии наследования. Вы не можете просто бросить между несвязанными типами.   -  person Jesper Juhl    schedule 07.06.2018
comment
Документация на самом деле довольно хорошо объясняет это.   -  person Mgetz    schedule 07.06.2018
comment
@Mgetz я не понял следующие несколько строк   -  person luG_0    schedule 07.06.2018
comment
См. здесь пункт 5. Часть 5c обычно наиболее полезна для меня (возврат null, если не может привести указатель). Вы можете думать об этом так, будто Java if (ptr instanceof Class) в C++ — это if (dynamic_cast<Class*>(ptr))   -  person Hitobat    schedule 07.06.2018
comment
@Hitobat В отличие от Java, C ++ имеет контроль доступа к наследованию и повторному наследованию, поэтому он более сложен.   -  person curiousguy    schedule 24.06.2018


Ответы (1)


Боковое приведение (5b) — это когда exp не относится к базовому типу new_type. Пример: если exp является указателем на B, который указывает на объект класса T, где T происходит как от B, так и от D, то

dynamic_cast<D*> (exp)

является побочным приведением, которое дает указатель на D основание T.

person Adrian W    schedule 07.06.2018
comment
D основание T, что подразумевается под этим - person luG_0; 07.06.2018
comment
Когда вы инициализируете объект, класс которого имеет несколько родительских классов, под капотом создается объект каждого родительского типа. В этом примере T происходит от B и D. Это приведение дает вам указатель на родительский объект D или базу. - person Joshua Breeden; 07.06.2018