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