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

发表于:2007-07-01来源:作者:点击数: 标签:
类之间的通信方法有很多种,在这里着重介绍利用虚函数的方法。希望对大家有帮助。 1 问题回顾:设数据处理类CData ,外界类CProcessGUI , 因为CData 不知道调用者类的类型(类型为CProcessGUI),只能利用调用者类的回调函数来处理问题。 现在利用虚函数来


类之间的通信方法有很多种,在这里着重介绍利用虚函数的方法。希望对大家有帮助。

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

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


原文转自:http://www.ltesting.net