#include <iostream>
#include <typeinfo>

struct A { virtual void Foo() {} };
struct B : public A { void Foo() {} };
struct C : public A { };

int main() {
	std::cout << "naive - fails" << std::endl;
	std::cout << int(&A::Foo == &A::Foo) << std::endl;
	std::cout << int(&A::Foo == &B::Foo) << std::endl;
	std::cout << int(&A::Foo == &C::Foo) << std::endl;

	std::cout << "needs gcc-only PMF extension - semi-works" << std::endl;
	std::cout << int(reinterpret_cast<void(*)()>(&A::Foo) == reinterpret_cast<void(*)()>(&A::Foo)) << std::endl;
	std::cout << int(reinterpret_cast<void(*)()>(&A::Foo) == reinterpret_cast<void(*)()>(&B::Foo)) << std::endl;
	std::cout << int(reinterpret_cast<void(*)()>(&A::Foo) == reinterpret_cast<void(*)()>(&C::Foo)) << std::endl;

	std::cout << "proper solution - works" << std::endl;
	std::cout << int(typeid(&A::Foo) == typeid(&A::Foo)) << std::endl;
	std::cout << int(typeid(&A::Foo) == typeid(&B::Foo)) << std::endl;
	std::cout << int(typeid(&A::Foo) == typeid(&C::Foo)) << std::endl;
	return 0;
}