利用C++ 虚函数实现类之间的通信

了解更多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  {
cout<< " i = "< 
......... // 各种其他 接口的处理
}
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_ VBaseGui[i]->ShowWindow(true);
}
else
{
for(int i = 0 ;i  m_ VBaseGui->ShowWindow(false);
}

for(int i = 0 ;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(); // 处理了外界类的各种情况 。

}
由此可以看出,我们是利用了父类的 指针调用子类的虚 函数,而不关心子类类型的功能。 这也就动态晚绑定的好处。

你可能感兴趣的:(C++)