Я хотел бы знать, как решить эту проблему. Я не понимаю, что мне задает этот вопрос:
dynamic_cast<Y>(new X)
Во-первых, чтобы быть законным, 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
будет иметь тип
«Указатель на наиболее производный тип», фактический эффект
будет идентичным (и опять же, таким же, как неявный
преобразование).
Вопрос должен быть:
Что вы можете сказать об определениях
X
а такжеY
так что следующий код допустим, а кроме того, что приведение успешно?
Тогда ответ довольно прост: X
должен быть полным типом для new
выражение должно быть законным. Динамические приведения действительны для трансляции на не виртуальную базу, поэтому если Y
является указателем на не виртуальную базу (возможно, квалифицированную CV, включая указатель на X
сам), актерский состав действителен а также преуспевает.
Кроме того, существуют другие допустимые варианты использования динамического приведения полиморфный типы (то есть классы с виртуальными функциями). Если X
полиморфна, то Y
может быть void *
, или же Y
может быть указателем на любой другой класс в иерархии наследования X
, Тем не менее, актерский состав будет только добиться успеха если Y
является указателем на базу (однако, эта база может быть виртуальной!).
(Обоснование для настоящего момента проще, чем для произвольного динамического приведения, поскольку мы уже знаем динамический тип касты. В общем, динамические приведения могут делать гораздо более сложные вещи.)
Это совершенно невозможно ответить без знания Y и X. Например, если Y — int, тогда незаконно. Иначе, если Y — указатель на полиморфный класс, он может быть успешным или нет, но в этом нет ничего «вероятного». Наконец, это довольно неприятная утечка памяти.