Tak, zawsze. Za pomocą static_cast.
struct A {};
struct B : A {}
B b;
A* aptr = static_cast<A*>(&b);
W drugą stronę najbezpieczniej za pomocą dynamic_cast. Zwróci nullptr jeśli obiekt pod wskaźnikiem okaże się innego typu niż ten na który castujesz.
A a;
B b;
A* ab = &b;
B* bptr = dynamic_cast<B*>(&a);
// bptr == nullptr
bptr = dynamic_cast<B*>(ab);
// bptr == &b
Tylko, żeby korzystać dynamic_cast klasa bazowa musi mieć conajmniej jedną metode wirtualną.