您的位置:首页 > 编程语言 > C语言/C++

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

}

由此可以看出,我们是利用了父类的指针调用子类的虚函数,而不关心子类类型的功能。
这也就动态晚绑定的好处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++