As far as I can guess, func is broken because its signature does not contain B. And dynamic_cast<B> looks probably unexpectable, right?
func
B
dynamic_cast<B>