真心求解谷歌一道困惑我1个晚上的面试题:两个类可以互为对方的成员吗?如果可以的话,调用过程有神马要注意的吗?看下面代码是如何逻辑
真心求解谷歌一道困惑我1个晚上的面试题:两个类可以互为对方的成员吗?如果可以的话,调用过程有神马要注意的吗?看下面代码是如何逻辑
问题1:解释逻辑!注意 CCommunicateV2 继承了 COverlappedBase,它应该也继承了 COverlappedBase的CommandTreeCtrBase *m_pUe成员,CommandTreeCtrBase是CUECtrlV20的基础类;而CUECtrlV20
则有一个叫m_OmtSocket的成员。这里面的逻辑貌似很复杂,谁真心解释解释
问题2:下面的 m_pUe->PostMsgToUE(pMsgBuf); m_pUe是基类指针,是怎么找到子类的PostMsgToUE
问题3:下面有一句话 // CUECtrlV20 * m_pUe; 被注释了,这句话 不注释合逻辑吗?
问题4:如果条件不充分,自己写上可能需要的必须条件(问题精华处)
class CCommunicateV2:public COverlappedBase
{
public:
CCommunicateV2();
~CCommunicateV2();
CRITICAL_SECTION m_csSocket; //神马结构
bool doMsg(UINT8* pDataRcv, UINT32 unDataLen);
// CUECtrlV20 * m_pUe;
};
class CUECtrlV20 :public CTTask,public CommandTreeCtrBase
{
public:
CUECtrlV20();
~CUECtrlV20();
void PostMsgToUE(UINT8 *data);
CCommunicateV2 m_OmtSocket;
}
背景代码
class COverlappedBase
{
public:
COverlappedBase();
~COverlappedBase();
//连接到server
virtual SOCKET ConnectToServer(char* strIP, UINT32 ulPort,CommandTreeCtrBase * pue);
protected:
CommandTreeCtrBase *m_pUe;
}
SOCKET COverlappedBase::ConnectToServer(char* strIP, UINT32 ulPort,CommandTreeCtrBase * pue)
{
m_pUe = pue;
memset(m_pOverlapped,0,sizeof(WSAOVERLAPPED));
......
m_socket = g_sockmanager.ConnectToServer(strIP,ulPort,m_pOverlapped);
return m_socket;
}
CSocketManage g_sockmanager;
SOCKET CSocketManage::ConnectToServer(char * strIP,UINT32 ulPort,PER_IO_OPERATION_DATA * lpPerIoData)
{
......
调用部分:
一、bool CCommunicateV2::doMsg(UINT8* pData, UINT32 unDataLen)
{
if (NULL != m_pUe)
{
m_pUe->PostMsgToUE(pMsgBuf);
}
}
二、if (!m_OmtSocket.IsServerConnected())
{
if (!m_OmtSocket.ConnectToServer(strUeIpAddr, pPara->ulUePort,this))
{
......
}