#include <list>
#include <utility>
#include <iostream>

#define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))

class Base
{
public:
	void doForAllDerived()
	{
		for (handlerList_t::const_iterator it = _registeredHandlers.begin(); it != _registeredHandlers.end(); ++it )
		{	
			PrepFn pFn = (*it);
			CALL_MEMBER_FN(*this, pFn )( 5 );		
		}
	}

protected:
    typedef void (Base::*PrepFn)( int n );

    void registerPrepFn( PrepFn fn )
    {
        _registeredHandlers.push_back( fn );
    };
    
private:
    typedef std::list< PrepFn > handlerList_t;
    handlerList_t _registeredHandlers;
};
 
class Derived : public Base
{
public:
    Derived(int m) : _m(m) {
        registerPrepFn( static_cast<PrepFn>(&Derived::derivedPrepFn) );
    };

protected:
    void derivedPrepFn( int n )
    {
		std::cout << _m << ", " << n << std::endl;
	};
 
	int _m;
};
 
int main() {
    Derived anInstance(20);
    anInstance.doForAllDerived();
}
