#include <cstdio> // for printf.
struct b
{
virtual void f() { std::printf("in b\n"); }
};
struct d1 : b
{
virtual void f() override { std::printf("in d1\n"); }
};
struct d2 : b
{
virtual void f() override { std::printf("in d2\n"); }
};
struct unko_f final
{
b *pb;
unko_f(b *pb) : pb(pb) {}
void operator=(b *pb) { this->pb = pb; }
void operator()() { this->pb->f(); }
};
struct unko_del final
{
b *pb;
void (b::*pbf)();
unko_del(b *pb, void (b::*pbf)()) : pb(pb), pbf(pbf) {}
void operator()() { ( (this->pb) ->* (this->pbf) ) (); }
};
int main()
{
d1 i1;
unko_f kusof(&i1);
kusof();
d2 i2;
kusof = &i2;
kusof();
unko_del del1(&i1, &b::f);
del1();
std::getchar();
}
I2luY2x1ZGUgPGNzdGRpbz4gICAgLy8gZm9yIHByaW50Zi4KCnN0cnVjdCBiCnsKCXZpcnR1YWwgdm9pZCBmKCkgeyBzdGQ6OnByaW50ZigiaW4gYlxuIik7IH0KfTsKCnN0cnVjdCBkMSA6IGIKewoJdmlydHVhbCB2b2lkIGYoKSBvdmVycmlkZSB7IHN0ZDo6cHJpbnRmKCJpbiBkMVxuIik7IH0KfTsKCnN0cnVjdCBkMiA6IGIKewoJdmlydHVhbCB2b2lkIGYoKSBvdmVycmlkZSB7IHN0ZDo6cHJpbnRmKCJpbiBkMlxuIik7IH0KfTsKCnN0cnVjdCB1bmtvX2YgZmluYWwKewoJYiAqcGI7Cgl1bmtvX2YoYiAqcGIpIDogcGIocGIpIHt9Cgl2b2lkIG9wZXJhdG9yPShiICpwYikgeyB0aGlzLT5wYiA9IHBiOyB9CgoJdm9pZCBvcGVyYXRvcigpKCkgeyB0aGlzLT5wYi0+ZigpOyB9Cn07CgpzdHJ1Y3QgdW5rb19kZWwgZmluYWwKewoJYiAqcGI7Cgl2b2lkIChiOjoqcGJmKSgpOwoKCXVua29fZGVsKGIgKnBiLCB2b2lkIChiOjoqcGJmKSgpKSA6IHBiKHBiKSwgcGJmKHBiZikge30KCgl2b2lkIG9wZXJhdG9yKCkoKSB7ICggKHRoaXMtPnBiKSAtPiogKHRoaXMtPnBiZikgKSAoKTsgfQp9OwoKaW50IG1haW4oKQp7CglkMSBpMTsKCXVua29fZiBrdXNvZigmaTEpOwoJa3Vzb2YoKTsKCglkMiBpMjsKCWt1c29mID0gJmkyOwoJa3Vzb2YoKTsKCgl1bmtvX2RlbCBkZWwxKCZpMSwgJmI6OmYpOwoJZGVsMSgpOwoKCXN0ZDo6Z2V0Y2hhcigpOwp9Cg==