一直对回调机制不是很了解,今天索性搜了很多资料顺便整理一下,进步一点点。

1.Callback方式(回调函数)

  什么是回调函数?

  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

typedef void (__stdcall *DownloadCallback)(const char* pURL, bool bOK);
void DownloadFile(const char* pURL, DownloadCallback callback)
{
cout << "downloading: " << pURL << "" << endl;
callback(pURL, true);
}
void __stdcall OnDownloadFinished(const char* pURL, bool bOK)
{
cout << "OnDownloadFinished, URL:" << pURL << " status:" << bOK << endl;
}
//初始化
DownloadCallback = OnDownloadFinished;

  回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法

2.虚拟方法

  本质是你按照对方要求实现一个C++接口,然后把你实现的接口设置给对方,对方需要触发事件时调用该接口

class IDownloadSink
{
public:
virtual void OnDownloadFinished(const char* pURL, bool bOK) = 0;
}; class CMyDownloader
{
public:
CMyDownloader(IDownloadSink* pSink)
:m_pSink(pSink)
{
} void DownloadFile(const char* pURL)
{
cout << "downloading: " << pURL << "" << endl;
if(m_pSink != NULL)
{
m_pSink->OnDownloadFinished(pURL, true);
}
} private:
IDownloadSink* m_pSink;
}; class CMyFile: public IDownloadSink
{
public:
void download()
{
CMyDownloader downloader(this);
downloader.DownloadFile("www.sina.com");
} virtual void OnDownloadFinished(const char* pURL, bool bOK)
{
cout << "OnDownloadFinished, URL:" << pURL << " status:" << bOK << endl;
}
};

这里使用多态,子类指针实例化父类指针。

父类子类指针函数调用注意事项
1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数(静态联翩)
2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会给程序员带来困扰。(一般不会这么去定义)
3,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。

最新文章

  1. Linux磁盘分区及配额
  2. angular使用总结
  3. Win7与Mint双系统安装体验
  4. Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
  5. matlab将多条曲线绘制在一起
  6. mySql 的基本操作
  7. win8 报file://CBD 0xc0000034 蓝屏
  8. Oracle基础学习1--Oracle安装
  9. Linux开机自动挂载Windows分区
  10. float浮动之后高度自适应失效解决方案
  11. javascript代码混淆原理
  12. Android - 支持不同的设备
  13. 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域
  14. Wijmo 5 + Ionic Framework之:费用跟踪 App
  15. 关于VS2017安装的一点扩充说明(15.5)
  16. #WEB安全基础 : HTML/CSS | 0x6嵌套标签(图片链接)
  17. 使用 dep 配置 golang 开发环境
  18. 「HNOI2016」最小公倍数
  19. ubuntu 下搭建redis和php的redis的拓展
  20. 使用block的时候,导致的内存泄漏

热门文章

  1. 7.15考试总结(NOIP模拟16)[Star Way To Heaven&#183;God Knows&#183;Lost My Music]
  2. odoo源生打印【web report】
  3. nexus 私服 设置本公司代理 记录
  4. spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
  5. YOLO-v4 口罩识别
  6. 白话JavaScript原型链和继承
  7. Salesforce Integration 概览(三) Remote Process Invocation—Fire and Forget(远程进程调用-发后即弃)
  8. 小马哥的 Java 项目实战营学习笔记(1)
  9. 3D网页小实验-基于多线程和精灵动画实现RTS式单位行为
  10. 在线文本的编辑框——kindeditor富文本编辑的使用