#include <iostream>
#include <tr1/functional>

class A {
public:
    virtual int foo(int p) {
        std::cout << "A::foo(" << p << ")" << std::endl;
        return 0;
    }
};

class B : public A {
public:
    virtual int foo(int p) {
        std::cout << "B::foo(" << p << ")" << std::endl;
        return 0;
    }
};

class C{
};

class D : public C, public A{
public:
    virtual int foo(int p) {
        std::cout << "D::foo(" << p << ")" << std::endl;
        return 0;
    }
};

int foo(int x) {
    std::cout << "foo(" << x << ")" << std::endl;
    return 0;
}

int main() {
    using std::tr1::function;
    using std::tr1::bind;
    using std::tr1::placeholders::_1;

    A *a = new A;
    A *b = new B;
    A *d = new D;
    function<int(int)> d1 = bind(&A::foo, a, _1);
    function<int(int)> d2 = bind(&A::foo, b, _1);
    function<int(int)> d3 = bind(&A::foo, d, _1);
    function<int(int)> d4 = foo;
    d1(100);
    d2(100);
    d3(100);
    d4(100);
}
