Thanks to Joshua's answer, and that's life saving indeed. :)
BTW, I can propose a slightly different method. Suppose you have created a plugin and now you are going to release its pro version - so you have the full control over both the plugins, so you can follow something like this:
Actual Plugin:
if( !function_exists('wpse36092_shortcode') {
function wpse36092_shortcode() {
echo 'This'; //existing content
}
}
add_shortcode( 'wpse36092', 'wpse36092_shortcode' );
Pro Plugin:
function wpse36092_shortcode() {
echo 'That'; //overwriting content
}
add_shortcode( 'wpse36092', 'wpse36092_shortcode' );
In this method, the name of the function should remain exact same.
You can do the same thing in your Parent theme and Child theme too.
But again, Joshua's answer was great.