2014-09-14 5 views
0

Я сделал некоторые поиски для этого, но только, чтобы удостовериться:Требуется полиморфный класс для dynamic_cast?

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

Спасибо.

+1

Базовый класс должен иметь как минимум одну виртуальную функцию для работы dynamic_cast –

+0

Что бы сделать это полиморфным, вот что я подумал. Спасибо. – jensa

+1

Строго говоря, он не обязательно должен быть полиморфным - например, у вас может быть один класс с виртуальным деструктором, который удовлетворяет критериям dyamic_cast, но не удовлетворяет критериям класса полиморфизма, поскольку существует только один класс с определенным поведением (разумеется, бессмысленно использовать динамический приведение в этом случае, но это немного другое дело) –

ответ

1

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

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

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

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

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

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

0

Для сбросов, типа базового класса -., Который является типом выражения литого - должен быть полиморфными, otherwise you get a compiler error Это потому, что dynamic_cast использует RTTI для выполнения броска и проверки. . является ли он успешным или нет - это и RTTI генерируется только для полиморфных типов

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

Смежные вопросы