Una explicación mas extensa y árida.
En C es "fácil" manipular direcciones de memoria al interior de punteros.
Guardas las dirección de memoria, luego la usas, desreferenciando el puntero.
La definicion de las funciones queda en alguna dirección de memoria. Esta direccion es guardada en un puntero constante. Este puntero constante es el nombre de la funcion. Por el solo hecho de definir una funcion, el cargador del ejecutable, gratis, realiza esta asignacion para ti. Por ejemplo, para la definición
f es un puntero constante, que guarda la dirección de memoria donde la función está y es entonces posible pasar f sin parentesis a una funcion que espera recibir un puntero a una funcion.
En el caso de métodos en C++ (o si quieres tomarlo asi, "funciones" al interior de una clase), ellos cumplen casi lo mismo.
Los nombres guardan direcciones de memoria, pero en realidad solo guardan un desplazamiento tomado desde el comienzo del objeto.
Si un objeto de una clase tiene un método dentro, este método (la dirección de memoria), está en la dirección del objeto + el desplazamiento del método.
Otro objeto de la misma clase compartirá con el anterior objeto el desplazamiento del método, pero no compartirá la dirección de comienzo del objeto. Para este 2do objeto, la dirección del método sera la dirección del objeto 2 + el mismo desplazamiento.
Entonces, cuando se trata de que una función o método reciba un método de
otra clase, no es suficiente recibir la
"dirección de memoria", pues solo estás recibiendo el
desplazamiento, necesitas un
objeto para poder calcular
la dirección definitiva.
Si el método es static, estos se comportan igual que las funciones globales, pues su definición es solo 1 para todos los objetos de la misma clase.
La sintaxis de los punteros a métodos (que guardan ese desplazamiento) es un poco mas complicada, pero revísala solo si la necesitas. Si te sirve la definición de las funciones globales, quédate con esa.