#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;
}