#include <cassert>
#include <functional>
using namespace std;
class Child;
class Parent
{
public:
virtual ~Parent() {}
function<void()> funcPointer;
function<void(Parent*)> funcPointer2;
void (Child::*funcPointer3)();
};
class Child : public Parent
{
public:
void TestFunc() {
}
void Do() {
funcPointer = bind(&Child::TestFunc, this);
funcPointer2 = [](Parent* arg) {
assert(dynamic_cast<Child*>(arg) != nullptr);
static_cast<Child*>(arg)->TestFunc();
};
funcPointer3 = &Child::TestFunc;
funcPointer();
funcPointer2(this);
(this->*funcPointer3)();
}
};
int main() {}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIENoaWxkOwpjbGFzcyBQYXJlbnQKewpwdWJsaWM6Cgl2aXJ0dWFsIH5QYXJlbnQoKSB7fQoKCWZ1bmN0aW9uPHZvaWQoKT4gZnVuY1BvaW50ZXI7CglmdW5jdGlvbjx2b2lkKFBhcmVudCopPiBmdW5jUG9pbnRlcjI7Cgl2b2lkIChDaGlsZDo6KmZ1bmNQb2ludGVyMykoKTsKfTsKCmNsYXNzIENoaWxkIDogcHVibGljIFBhcmVudAp7CnB1YmxpYzoKCXZvaWQgVGVzdEZ1bmMoKSB7CgoJfQoJdm9pZCBEbygpIHsKCQlmdW5jUG9pbnRlciA9IGJpbmQoJkNoaWxkOjpUZXN0RnVuYywgdGhpcyk7CgkJZnVuY1BvaW50ZXIyID0gW10oUGFyZW50KiBhcmcpIHsgCgkJCWFzc2VydChkeW5hbWljX2Nhc3Q8Q2hpbGQqPihhcmcpICE9IG51bGxwdHIpOwoJCQkKCQkJc3RhdGljX2Nhc3Q8Q2hpbGQqPihhcmcpLT5UZXN0RnVuYygpOwoJCX07CgkJZnVuY1BvaW50ZXIzID0gJkNoaWxkOjpUZXN0RnVuYzsKCQlmdW5jUG9pbnRlcigpOwoJCWZ1bmNQb2ludGVyMih0aGlzKTsKCQkodGhpcy0+KmZ1bmNQb2ludGVyMykoKTsKCX0KfTsKCmludCBtYWluKCkge30=