pure virtual and function pointers and enum