#include <iostream>
struct A
{
virtual void foo() { std::cout << "A::foo\n"; }
};
struct AA : A
{
virtual void foo() { std::cout << "AA::foo\n"; }
};
struct AAA : AA
{
virtual void foo() { std::cout << "AAA::foo\n"; }
};
void bar (A& a, void (A::* pMem)())
{
(a.*pMem)();
}
int main() {
A a;
AA aa;
AAA aaa;
bar (a, &A::foo);
bar (aa, &A::foo);
bar (aaa, &A::foo);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEEKewoJdmlydHVhbCB2b2lkIGZvbygpIHsgc3RkOjpjb3V0IDw8ICJBOjpmb29cbiI7IH0gCn07CgpzdHJ1Y3QgQUEgOiBBCnsKCXZpcnR1YWwgdm9pZCBmb28oKSB7IHN0ZDo6Y291dCA8PCAiQUE6OmZvb1xuIjsgfSAKfTsKCnN0cnVjdCBBQUEgOiBBQQp7Cgl2aXJ0dWFsIHZvaWQgZm9vKCkgeyBzdGQ6OmNvdXQgPDwgIkFBQTo6Zm9vXG4iOyB9IAp9OwoKdm9pZCBiYXIgKEEmIGEsIHZvaWQgKEE6OiogcE1lbSkoKSkKewoJKGEuKnBNZW0pKCk7Cn0KCmludCBtYWluKCkgewoJQSBhOwoJQUEgYWE7CglBQUEgYWFhOwoJCgliYXIgKGEsICZBOjpmb28pOwoJYmFyIChhYSwgJkE6OmZvbyk7CgliYXIgKGFhYSwgJkE6OmZvbyk7CgkKCXJldHVybiAwOwp9