#include template class SubSys { public: virtual void Handle(T*) { std::cout << "Event recieved but not handled." << std::endl; }; }; class Event { public: virtual void dispatch() = 0; }; template class BaseEvent : public Event { public: void addListener(SubSys* ss_ptr) { ssptr = ss_ptr; }; virtual void dispatch() { ssptr->Handle(dynamic_cast(this)); } static SubSys* ssptr; }; template SubSys* BaseEvent::ssptr; /*------------------------------------*/ class SubEvent : public BaseEvent { }; class StupidEvent : public BaseEvent { }; class SubSystem : public SubSys, public SubSys { public: void Handle(SubEvent* e) { std::cout << " Got a subevent" << std::endl; } void Handle(StupidEvent* e) { std::cout << " Got a stupidevent" << std::endl; } }; int main() { StupidEvent* a = new StupidEvent; SubEvent* b = new SubEvent; SubSystem *ss = new SubSystem; b->addListener(ss); a->addListener(ss); delete b; delete a; Event* d = new StupidEvent; Event* c = new SubEvent; c->dispatch(); d->dispatch(); return 0; };