Use subroutine calls when you want to create your own explicit binding, use -> notation when you desire runtime binding of the message.

Of course, it would be my opinion that it is particularly bad form for a child class to re-implement a method in a manner that is not backward compatible - it's a violation of the contract as far as I'm concerned.