#include <iostream> #include <typeinfo.h> class MyBase { public: virtual void myfunc() {} }; class AnotherClass : public MyBase {}; using namespace std; int main() { AnotherClass* pAnother = new AnotherClass; MyBase* pMyBase = pAnother; cout << typeid(pMyBase).name() << endl; cout << typeid(*pMyBase).name() << endl; cout << typeid(pAnother).name() << endl; cout << typeid(*pAnother).name() << endl; delete pAnother; }For flexible parameters you can use void or universal pointers which is quite a common approach in the Win32 API. You don't have to use overloading and can still determine type information.