Here's one rudimentry explanation.
Say there is a parent class P and a child class C
now consider pp, an instance of P, and cc, an instance of C.
In the assignment pp = cc, the compiler knows cc ISA pp (if you are not sure about this, then search for OO documents on inheritance and
polymorphism) Hence it lets this happen.
In the assignment cc = pp however, pp is not a type of cc, rather the other way round. The compiler checks this by looking at the inheritance hierarchy, and since the inheritance tree is as such:
P+
|
|__C
an instance of C is also an instance of P, but not the other way round, hence you end up with the result you see.
HTH