一个工程需要甲乙两个人一起完成:
甲方:正常工作需要ABC三个模块,A、C模块我都有,我需要一个B,而且我对B是有要求的;
乙方:我正好有B,你看行不行,你需要的时候我把B模块的密钥告诉你。
上文中的B就是回调函数,甲方规定了回调函数的格式,乙方负责根据格式和项目要求去送给甲方不同的B(回调函数),通常乙方都会通过将自己所拥有的B的密钥送给甲来实现(即函数指针)。
为什么要使用这样一个机制呢?可能有两种情况:
1.这个项目的要求可能会更改,AC模块不用变,B模块需要经常更改,这个时候甲方不用动,乙方送上不同的B模块就好;
2.B模块规定只能由乙方来拥有,甲不能拥有B的所有权。
第一种情况不用解释,现实中就是为了解耦。针对第二种情况,现实中有许多例子:
例子1:QT中的槽函数就相当于一个回调函数,UI主线程是乙方,指定了槽函数,控件是甲方负责将信号告诉UI线程信号,能得到信号是因为开启了消息循环;
例子2:开辟了一个子线程用于获取图像,但是需要显示在主界面上,子线程是不能直接重绘界面的,此时需要在UI主线程中预先给子线程一个图像显示区域的句柄(指针),其实也就是回调函数,告诉子线程你需要重绘的时候告诉我,我来执行。