#include <iostream>
#include <functional>
#include <memory>
class A {
public:
virtual void operator()() {
std::cout << "classA" << std::endl;
}
virtual ~A() {}
};
class B : public A {
public:
void operator()() {
std::cout << "classB" << std::endl;
}
};
class C : public B {
public:
void operator()() final {
std::cout << "classC" << std::endl;
}
};
int main()
{
std::shared_ptr<A> a(new A);
std::shared_ptr<A> b(new B);
std::shared_ptr<A> c(new C);
std::function<void(void)>func[] = {
std::bind(std::mem_fn(&A::operator()), a),
std::bind(std::mem_fn(&A::operator()), b),
std::bind(std::mem_fn(&A::operator()), c),
};
for (auto a : func)
a();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPG1lbW9yeT4KCmNsYXNzIEEgewpwdWJsaWM6CiAgdmlydHVhbCB2b2lkIG9wZXJhdG9yKCkoKSB7CiAgICBzdGQ6OmNvdXQgPDwgImNsYXNzQSIgPDwgc3RkOjplbmRsOwogIH0KICB2aXJ0dWFsIH5BKCkge30KfTsKCmNsYXNzIEIgOiBwdWJsaWMgQSB7CnB1YmxpYzoKICB2b2lkIG9wZXJhdG9yKCkoKSB7CiAgICBzdGQ6OmNvdXQgPDwgImNsYXNzQiIgPDwgc3RkOjplbmRsOwogIH0KfTsKCmNsYXNzIEMgOiBwdWJsaWMgQiB7CnB1YmxpYzoKICB2b2lkIG9wZXJhdG9yKCkoKSBmaW5hbCB7CiAgICBzdGQ6OmNvdXQgPDwgImNsYXNzQyIgPDwgc3RkOjplbmRsOwogIH0KfTsKCmludCBtYWluKCkKewogIHN0ZDo6c2hhcmVkX3B0cjxBPiBhKG5ldyBBKTsKICBzdGQ6OnNoYXJlZF9wdHI8QT4gYihuZXcgQik7CiAgc3RkOjpzaGFyZWRfcHRyPEE+IGMobmV3IEMpOwoKICBzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+ZnVuY1tdID0gewogICAgc3RkOjpiaW5kKHN0ZDo6bWVtX2ZuKCZBOjpvcGVyYXRvcigpKSwgYSksCiAgICBzdGQ6OmJpbmQoc3RkOjptZW1fZm4oJkE6Om9wZXJhdG9yKCkpLCBiKSwKICAgIHN0ZDo6YmluZChzdGQ6Om1lbV9mbigmQTo6b3BlcmF0b3IoKSksIGMpLAogIH07CgogIGZvciAoYXV0byBhIDogZnVuYykKICAgIGEoKTsKfQ==