Ответ 1
Да, вы можете.
Как показывает стандарт С++ в §5.2.7/5 о выражении dynamic_cast<T>(v)
:
Если
T
является "указателем на cv1B
" иv
имеет тип "указатель на cv2D
", так чтоB
является базовым классомD
, результатом является указатель на уникальныйB
подобъектом объектаD
, на который указываетv
.
Приведен пример:
struct B { }; struct D : B { }; void foo(D* dp) { B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp; }
Как вы можете видеть, полиморфные классы явно не являются единственным вариантом использования dynamic_cast
, разрешенным стандартом.
Кстати, cppreference.com объясняет это на менее стандартном языке:
Если new_type является указателем или ссылкой на Base, а тип выражение является указателем или ссылкой на Derived, где Base является уникальный, доступный базовый класс Derived, результатом является указатель или ссылка на подобъект класса Base в производном объекте указывается или идентифицируется выражением. (Примечание: неявные литые и static_cast также может выполнять это преобразование.)