class ClassA;


typedef DWORD (/**//*CALLBACK*/ ClassA::*lpGetFunctionAddr)(LPCTSTR);


class ClassA


{
public:

ClassA()
{}

virtual ~ClassA()
{}
DWORD MsgBox(LPCTSTR Text)

{
MessageBoxA(NULL,Text,"ClassA::MsgBox Called!",0);

return (DWORD)MessageBoxA;
}
};


class ClassB


{
private:
ClassA * m_pObjectA;
lpGetFunctionAddr m_FuncPtr;
public:

ClassB() : m_pObjectA(NULL),m_FuncPtr(NULL)
{}

virtual ~ClassB()
{}

void SetDo(ClassA * pObjA,lpGetFunctionAddr FuncPtr)

{
m_pObjectA = pObjA;
m_FuncPtr = FuncPtr;
}
void DoIt()

{
if(m_pObjectA && m_FuncPtr)

{
DWORD dwRet = (m_pObjectA->*m_FuncPtr)(TEXT("ClassB::DoIt()"));
((int (WINAPI*)(HWND,LPCSTR ,LPCSTR,UINT))dwRet)(NULL,"ClassB::DoIt() Over!","ClassB",0);
}
}
};

int main(int argc, char* argv[])


{
ClassA * pObjectA = new ClassA();
ClassB * pObjectB = new ClassB();
pObjectB->SetDo(pObjectA,&ClassA::MsgBox);

pObjectB->DoIt();

delete[] pObjectB;
delete[] pObjectA;

return 0;
}