This was an interview question. Consider the following:
struct A {};
struct B : A {};
A a;
B b;
a = b;
b = a;
Why does b = a;
If I am getting interviewed then, I will explain in little philosophical way.
a = b;
is valid, because every B contains A as its part. So a can extract A from within B. However, A doesn't contain B. thus b cannot find B from within A; that's why,
b = a;
is invalid.
[Analogically, a void* can be found in any Type*, but Type* cannot be found in void* (thus we need a cast).]