利用C++ 虚函数实现类之间的通信
2013-07-03 17:50
357 查看
了解更多IOS底层原理知识,关注腾讯课堂八点钟学院IOS高级开发
IOS学习交流群 431449751
类之间的通信方法有很多种,在这里着重介绍利用虚函数的方法。希望对大家有帮助。
1 问题回顾:设数据处理类CData ,外界类CProcessGUI , 因为CData 不知道调用者类的类型(类型为CProcessGUI),只能利用调用者类的回调函数来处理问题。 现在利用虚函数来改进这一问题的处理过程,使得CData
可灵活处理调用者类的各种操作。
2 处理难点: CData类得到了调用者类的指针(LPVOID)Lparam
, 却因为无法得知调用者类的类型,而无法进行转换。常规的知道调用者的类型会做如下转换:
CProcessGUI *PT = (CProcessGUI *)Lpararm;
PT->Function(...) //利用PT 进行各种操作了。
3 解决方法 :将要操作调用者类的函数在抽象类中写成接口 。
Class BaseGUI
{
Virtual void ShowWindow(Bool b )= 0; // 显示界面
Virtual void ProcessDataShow(int Idata) = 0; // 在界面中处理数据
..... // 各种你想要的操作
}
Class ProcessGUI :public BaseGUI
{
virtual void ShowWindow(Bool b)
{
if(b)
{
this->ShowWindow(SW_HIDE);
}
else
{
this->ShowWindow(SW_SHOW);
}
}
virtual void ProcessDataShow(int Idata)
{
for(int i = 0 ;i <idata;i++)
{
cout<< " i = "< <i<<endl;
}
......... // 各种其他接口的处理
}
Class CData
{
BaseGUI * m_BaseGui ;
void GetGUI(BaseGUI *pB)
{
m_BaseGui = pB;
}
void Run ()
{
...... // 各种处理
if(...)
m_BaseGui->ShowWindow(true);
else
m_BaseGui->ShowWindow(false);
m_BaseGui->ProcessDataShow(x); // X为所要通知给界面类的真正数据
}
}
4 使用方法
void main(void )
{
ProcessGUI A;
CData B;
B.GetGUI(&A); // 此时 m_BaseGui 就指向了A对象;
B.Run(); // B 并没有关心A对象是何类型 ,但却利用A对象的指针作了B想要控制的事情 ;
} 5 扩展 CData 作为 多个外界类 的服务。
同理让多个外界类继承BaseGUI类 。
在CData中 加入
Class CData
{
vector m_VBaseGui ;
void push(BaseGUI *pB)
{
m_VBaseGui.push_back(pB);
}
void Run ()
{
...... // 各种处理
if(...)
{
for(int i = 0 ;i<m_vbsegui.size();i++)
m_VBaseGui[i]->ShowWindow(true);
}
else
{
for(int i = 0 ;i<m_vbsegui.size();i++)
m_VBaseGui->ShowWindow(false);
}
for(int i = 0 ;i<m_vbsegui.size();i++)
m_VBaseGui->ProcessDataShow(x); // X为所要通知给界面类的真正数据
}
}
void main(void)
{
ProcessGUI1 A;
ProcessGUI2 B;
ProcessGUI3 C;
CData data;
data.push(&A);
data.push(&B);
data.push(&C);
data.Run(); // 处理了外界类的各种情况 。
}
由此可以看出,我们是利用了父类的指针调用子类的虚函数,而不关心子类类型的功能。
这也就动态晚绑定的好处。
IOS学习交流群 431449751
类之间的通信方法有很多种,在这里着重介绍利用虚函数的方法。希望对大家有帮助。
1 问题回顾:设数据处理类CData ,外界类CProcessGUI , 因为CData 不知道调用者类的类型(类型为CProcessGUI),只能利用调用者类的回调函数来处理问题。 现在利用虚函数来改进这一问题的处理过程,使得CData
可灵活处理调用者类的各种操作。
2 处理难点: CData类得到了调用者类的指针(LPVOID)Lparam
, 却因为无法得知调用者类的类型,而无法进行转换。常规的知道调用者的类型会做如下转换:
CProcessGUI *PT = (CProcessGUI *)Lpararm;
PT->Function(...) //利用PT 进行各种操作了。
3 解决方法 :将要操作调用者类的函数在抽象类中写成接口 。
Class BaseGUI
{
Virtual void ShowWindow(Bool b )= 0; // 显示界面
Virtual void ProcessDataShow(int Idata) = 0; // 在界面中处理数据
..... // 各种你想要的操作
}
Class ProcessGUI :public BaseGUI
{
virtual void ShowWindow(Bool b)
{
if(b)
{
this->ShowWindow(SW_HIDE);
}
else
{
this->ShowWindow(SW_SHOW);
}
}
virtual void ProcessDataShow(int Idata)
{
for(int i = 0 ;i <idata;i++)
{
cout<< " i = "< <i<<endl;
}
......... // 各种其他接口的处理
}
Class CData
{
BaseGUI * m_BaseGui ;
void GetGUI(BaseGUI *pB)
{
m_BaseGui = pB;
}
void Run ()
{
...... // 各种处理
if(...)
m_BaseGui->ShowWindow(true);
else
m_BaseGui->ShowWindow(false);
m_BaseGui->ProcessDataShow(x); // X为所要通知给界面类的真正数据
}
}
4 使用方法
void main(void )
{
ProcessGUI A;
CData B;
B.GetGUI(&A); // 此时 m_BaseGui 就指向了A对象;
B.Run(); // B 并没有关心A对象是何类型 ,但却利用A对象的指针作了B想要控制的事情 ;
} 5 扩展 CData 作为 多个外界类 的服务。
同理让多个外界类继承BaseGUI类 。
在CData中 加入
Class CData
{
vector m_VBaseGui ;
void push(BaseGUI *pB)
{
m_VBaseGui.push_back(pB);
}
void Run ()
{
...... // 各种处理
if(...)
{
for(int i = 0 ;i<m_vbsegui.size();i++)
m_VBaseGui[i]->ShowWindow(true);
}
else
{
for(int i = 0 ;i<m_vbsegui.size();i++)
m_VBaseGui->ShowWindow(false);
}
for(int i = 0 ;i<m_vbsegui.size();i++)
m_VBaseGui->ProcessDataShow(x); // X为所要通知给界面类的真正数据
}
}
void main(void)
{
ProcessGUI1 A;
ProcessGUI2 B;
ProcessGUI3 C;
CData data;
data.push(&A);
data.push(&B);
data.push(&C);
data.Run(); // 处理了外界类的各种情况 。
}
由此可以看出,我们是利用了父类的指针调用子类的虚函数,而不关心子类类型的功能。
这也就动态晚绑定的好处。
相关文章推荐
- VC中利用多线程技术实现线程之间的通信
- VC中利用多线程技术实现线程之间的通信(一)---理解线程
- VC中利用多线程技术实现线程之间的通信
- VC中利用多线程技术实现线程之间的通信
- VC中利用多线程技术实现线程之间的通信
- C#利用服务器实现客户端之间通信
- VC中利用多线程技术实现线程之间的通信
- 利用多层交换机实现不同VLAN之间的通信
- VC中利用多线程技术实现线程之间的通信(二)---线程的管理和操作
- VC中利用多线程技术实现线程之间的通信
- C++是如何利用虚函数实现多态性的?
- VC中利用多线程技术实现线程之间的通信
- 【c/c++】完成端口服务器中转实现两个客户端之间通信
- VC中利用多线程技术实现线程之间的通信
- VC中利用多线程技术实现线程之间的通信
- VC中利用多线程技术实现线程之间的通信(三)---线程之间的同步
- VC中利用多线程技术实现线程之间的通信
- VC中利用多线程技术实现线程之间的通信(四)---实例
- 利用LocalConnection实现多个应用之间的通讯 (不同MXML之间的通信)
- VC中利用多线程技术实现线程之间的通信