C++回调机制
2024-08-30 14:46:51
一直对回调机制不是很了解,今天索性搜了很多资料顺便整理一下,进步一点点。
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,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调用成员函数时,到底调用那个函数要根据指针的原型来确定,而不是根据指针实际指向的对象类型确定。
最新文章
- Linux磁盘分区及配额
- angular使用总结
- Win7与Mint双系统安装体验
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
- matlab将多条曲线绘制在一起
- mySql 的基本操作
- win8 报file://CBD 0xc0000034 蓝屏
- Oracle基础学习1--Oracle安装
- Linux开机自动挂载Windows分区
- float浮动之后高度自适应失效解决方案
- javascript代码混淆原理
- Android - 支持不同的设备
- 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域
- Wijmo 5 + Ionic Framework之:费用跟踪 App
- 关于VS2017安装的一点扩充说明(15.5)
- #WEB安全基础 : HTML/CSS | 0x6嵌套标签(图片链接)
- 使用 dep 配置 golang 开发环境
- 「HNOI2016」最小公倍数
- ubuntu 下搭建redis和php的redis的拓展
- 使用block的时候,导致的内存泄漏
热门文章
- 7.15考试总结(NOIP模拟16)[Star Way To Heaven&#183;God Knows&#183;Lost My Music]
- odoo源生打印【web report】
- nexus 私服 设置本公司代理 记录
- spring Data Rest 远程命令执行漏洞(CVE-2017-8046)
- YOLO-v4 口罩识别
- 白话JavaScript原型链和继承
- Salesforce Integration 概览(三) Remote Process Invocation—Fire and Forget(远程进程调用-发后即弃)
- 小马哥的 Java 项目实战营学习笔记(1)
- 3D网页小实验-基于多线程和精灵动画实现RTS式单位行为
- 在线文本的编辑框——kindeditor富文本编辑的使用