关于回调,在C++ 面向对象里面好像并没有什么比较被关注,感觉比较弱化的一个概念,但是从作为从C开发过来的人,对于回调并不陌生,这么重要的一种方式在c++中怎么没有提及?至少很少见到设置回调的,这次就回调这个思想就在c++ 里面谈一下个人的见解:
C开发,被划分为面向过程式开发,也就是遵照计算机的顺序执行 方式开发,但有的时候编写一个函数,希望这个函数执行到某一个结果时就处理一个特定的任务 比如通知一下调用者执行的进度,得到进度怎么处理这个进度的信息是调用者决定的,给出这个进度并实际触发处理进度是被调用者决定的,什么时候来触发处理进度?调用者不知道,这个时候由主动调用转变成被动被调用。 这种调用关系由主变从,其实就是一个 回调。
在C++ (oop面向对象)的编程中,调用关系更加复杂化,而这种回调的思想,其实就包含在其中,c++的设计者应该是希望弱化这些概念,降低使用者的工作量(制作工具的人,总是希望使用工具的人就单纯好好使用工具即可,所以总云:开发者不需要关系XX细节,能快速构建XX之类,所以多有知其然不知其所以然的困惑。 不过,作为从嵌入式开发过来的码农,总是喜欢刨根问底啊)。
这个回调关系的体现,就在继承关系中的 虚函数 中。
虚函数,用一句经典的话概括一下:使用基类的指针或引用指向派生类的对象,通过该指针或引用调用的是派生类的方法。
上一段代码解释这一句:
class A
{
public:
virtual void foo()
{
cout<<"A::foo() is called"<<endl;
}
};
class B:public A
{
public:
void foo()
{
cout<<"B::foo() is called"<<endl;
}
};
int main(void)
{
A *a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
return 0;
}
虚函数的调用场景和对应关系,换一张图概括:
橙色线条标出了回调,B类调用A类的方法,A类对应方法有转而调用B类的方法。
所以在C++中要回调,用c++的虚函数即可,如果非要搞成c里面一样注册回调然后调用,也不是没有办法,原理一样,预先设置一个函数地址进去,然后调用,不过如果被注册的函数是封装在一个类里面,就没那么简单了,因为,一个方法(函数)可能属于一个具体的对象,也可能属于 类。
具体的实施方法,个人的另一篇可参考:https://blog.csdn.net/u012459903/article/details/85259687