Требуется ли полиморфный класс для dynamic_cast?

0

Я пробовал это, но просто чтобы убедиться:

Использование dynamic_cast для dynamic_cast указателя базового класса на указатель производного класса требует, чтобы базовый класс был полиморфным? В противном случае мы даже не сможем скомпилировать?

Благодарю.

  • 1
    Базовый класс должен иметь хотя бы одну виртуальную функцию для работы dynamic_cast
  • 0
    Что бы сделать его полиморфным, вот что я думал. Спасибо.
Показать ещё 3 комментария
Теги:

2 ответа

1

Вы можете использовать dynamic_cast для приведения производного класса к не полиморфному базовому классу. Но вы не можете dynamic_cast не полиморфную базу для производного класса.

Стандарт объясняет (§5.2.7):

(1) Результат выражения dynamic_cast (v) (...)

(5) Если T является "указателем на cv1 B", а v имеет тип "указатель на cv2 D", так что B является базовым классом D, результат является указателем на единственный подобъект B объекта D, на который указывает v,

(6) В противном случае, v должен быть указателем или значением gl полиморфного типа

Полиморфный смысл здесь в очень скромном смысле: "Класс, объявляющий или наследующий виртуальную функцию, называется полиморфным классом". (§10.3/1).

0

Для Upcasts тип базового класса, который является типом литого выражения, должен быть полиморфным, иначе вы получите ошибку компилятора. Это связано с тем, что dynamic_cast использует RTTI для выполнения приведения и проверяет, успешна она или нет, и RTTI генерируется только для полиморфных типов.

static_cast с другой стороны, не проверяет, действителен ли актер; если это не так, то приведение вызывает неопределенное поведение. static_cast просто добавляет или вычитает смещение от указателя (или внутреннего указателя ссылки). dynamic_cast выполняет проверку типа времени выполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню