Ответ 1
Синтаксические ошибки не выдерживают, вы не можете dynamic_cast
неполиморфным типом. static_cast
- это бросок, который вы использовали бы в этом случае, если вы знаете, что он на самом деле является объектом целевого типа.
Причина: static_cast
в основном имеет компилятор, выполняющий проверку во время компиляции. "Может ли вход быть передан на выход?" Это можно использовать для случаев, когда вы выполняете или уменьшаете иерархию наследования указателей (или ссылок). Но проверка выполняется только во время компиляции, и компилятор предполагает, что вы знаете, что вы делаете.
dynamic_cast
может использоваться только в случае указания указателя или ссылки, и в дополнение к проверке времени компиляции он выполняет дополнительную проверку времени выполнения, что литье является законным. Это требует, чтобы рассматриваемый класс имел по крайней мере 1 виртуальный метод, который позволяет компилятору (если он поддерживает RTTI) выполнять эту дополнительную проверку. Однако, если этот тип не имеет виртуальных методов, он не может быть использован.
Простейший случай, и, вероятно, стоит, если вы пропустите указатели вокруг этого, должен рассмотреть возможность создания виртуального виртуального деструктора базового класса. В дополнение к тому, чтобы вы могли использовать динамический кастинг, он также позволяет вызывать правильные деструкторы при удалении указателя базового класса.