Legal dynamic_cast

Я хотел бы знать, как решить эту проблему. Я не понимаю, что мне задает этот вопрос:

dynamic_cast<Y>(new X)
  • Быть законным?
  • Чтобы, вероятно, добиться успеха?

1

Решение

Во-первых, чтобы быть законным, Y должен быть указателем типа. Итак, начнем
перепишите вопрос как dynamic_cast<Y
cv_qualifiers*>( new X )
, Сделав это, это
законно, если X является полным типом класса, и если либо X это
полиморфный тип, или Y тот же тип, что и X или является базой
класс X,

Это удастся, если Y такой же как Xили является базовым классом
X, Обратите внимание, что в этих случаях dynamic_cast имеет то же самое
поведение как static_castи фактически соответствует
неявное преобразование, поэтому обычно пишут new X,
без какого-либо состава. (Есть несколько особых случаев, когда
может потребоваться, как правило, при передаче результатов void* параметр. В таких случаях я бы предпочел
static_cast, но семантика двух именно
то же самое в этом случае.)

Наконец, есть один особый случай (который также будет успешным): если
X является полиморфным типом, и Y является void
cv_qualifiers *
, В этом случае dynamic_cast
делает имеют другую семантику, чем static_cast, хотя
так как X* вернулся из new X будет иметь тип
«Указатель на наиболее производный тип», фактический эффект
будет идентичным (и опять же, таким же, как неявный
преобразование).

3

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

Вопрос должен быть:

Что вы можете сказать об определениях X а также Y так что следующий код допустим, а кроме того, что приведение успешно?

Тогда ответ довольно прост: X должен быть полным типом для new выражение должно быть законным. Динамические приведения действительны для трансляции на не виртуальную базу, поэтому если Y является указателем на не виртуальную базу (возможно, квалифицированную CV, включая указатель на X сам), актерский состав действителен а также преуспевает.

Кроме того, существуют другие допустимые варианты использования динамического приведения полиморфный типы (то есть классы с виртуальными функциями). Если X полиморфна, то Y может быть void *, или же Y может быть указателем на любой другой класс в иерархии наследования X, Тем не менее, актерский состав будет только добиться успеха если Y является указателем на базу (однако, эта база может быть виртуальной!).

(Обоснование для настоящего момента проще, чем для произвольного динамического приведения, поскольку мы уже знаем динамический тип касты. В общем, динамические приведения могут делать гораздо более сложные вещи.)

3

Это совершенно невозможно ответить без знания Y и X. Например, если Y — int, тогда незаконно. Иначе, если Y — указатель на полиморфный класс, он может быть успешным или нет, но в этом нет ничего «вероятного». Наконец, это довольно неприятная утечка памяти.

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