GetValueImpl is a template so it can not be virtual. That's why there is a single templated implementation and the 3 versions of the virtual API for 3 different return types per class. 
This is the "messy" case that make me ask you again if we want to go that road. This is the best implementation I could think of I am afraid.