Polymorphisn depends on the actual type of the object the instance method is called on. However, the matching of method signatures to argument types is done at compile time based on the declared type of the reference.
In this case, the arguments used to call method m1() are all of type A1.
Method B1.m1(B1) cannot take an A1 argument because an A1 object might or might not actually be a B1 object. The same thing applies to method C1.m1(C1). So the only m1() method that can accept an A1 argument is A1.m1(A1).
Since only one of the overloaded m1() methods has a matching signature, polymorphism never happens.