All, что скажите про такой способ определения типа объекта в run time. Этакий куцый rtti:
class IFoo
{
public:
virtual ~IFoo() {}
public:
virtual int id() const = 0;
// тут всякая интерфейсная лабуда
...
virtual void a() = 0;
virtual void b() = 0;
};
template <class T>
class UniqId : public IFoo
{
public:
static int uniqId() { return (int)&uniqId; } // фишка в том, что адрес uniqId уникальный для разных T
//////////////////////
// IFoo partial impl
public:
virtual int id() const { return uniqId(); }
};
class Foo1 : public UniqId<Foo1> { /* реализация IFoo::a(), IFoo::b() */ };
class Foo2 : public UniqId<Foo2> { /* реализация IFoo::a(), IFoo::b() */ };
// использование такое:
void doSmth(IFoo *obj)
{
obj->a();
if(obj->id() == Foo1::uniqId())
{
((Foo1*)obj)->Foo1SpecificMethod();
}
}
Тока про плохой дизайн писать не надо, суть не в этом.