#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