Я написал код и перепугался, что он не будет работать - так что я написал прототип:Boost :: Перегрузка и перегрузка виртуальных функций: зачем они работают?
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>
class base {
private:
boost::function<void (int)> action;
protected:
virtual void onDataBaseReady(int i) { std::cout << i << std::endl; }
public:
void call() {
action(10);
}
base() {
action = boost::bind(&base::onDataBaseReady, this, _1);
}
};
class child : public base {
protected:
virtual void onDataBaseReady(int i) { std::cout << i+10 << std::endl; }
};
int main()
{
static child c;
c.call();
std::cin.get();
return 0;
}
, который компилирует и работает. (выходы 20
). Но почему? Также я тестировал в VS2010 и задался вопросом, будет ли он работать на разных платформах (например, скомпилирован под GCC)?
В основном action = boost::bind(&base::onDataBaseReady, this, _1);
меня пугает - мы говорим &base::
...
* мы говорим, и база :: ... * и мы указываем на функцию с полиморфным поведением. Меня это испугало бы, если бы он не назвал окончательного перехватчика! –