If you publish a normal function, you give a one-sided contract:  
*What does the function do if called?*

If you publish a callback, you also give a one-sided contract:  
*When and how will it be called?*

And if you publish an overridable function, it's both at once, so you give a two-sided contract:  
*When will it be called, and what must it do if called?*

Even if your users aren't abusing your API (by breaking *their* part of the contract, which might be prohibitively expensive to detect), you can easily see that the latter needs far more documentation, and *everything* you document is a commitment, which limits your further choices.

An example of reneging on such a two-sided contract is the move from `show` and `hide` to `setVisible(boolean)` in [java.awt.Component](//docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/awt/Component.html#setVisible(boolean)).