No, changing the type is not enough.
struct base1 { };
struct base2 { };
struct derived : base1, base2 { };
int main(int, char**)
{
base2 *b = new derived;
base1 *br = reinterpret_cast<derived *>(b);
base1 *bs = static_cast<derived *>(b);
std::cout << b << std::endl;
std::cout << br << std::endl;
std::cout << bs << std::endl;
}
Here, b is a base2-pointer to a derived object, and br and bs are base1-pointers to the derived object typecast via the derived class using reinterpret_cast and static_cast, respectively.
The br pointer is an invalid cast because you have a base1 pointer incorrectly pointing to the base2 subclass of the derived object. The bs pointer is a valid pointer because you have a base1 pointer correctly pointing to the base1 subclass of the derived object.
Try the program, the two last pointers should be different. The cast requires changing the pointer's value as well as changing its type.