Бьерн Страуструп - Язык программирования С++. Главы 5-7 - Указатели на члены

ОГЛАВЛЕНИЕ

5.4.5 Указатели на члены

Можно брать адрес члена класса. Операция взятия адреса функции-члена часто оказывается полезной, поскольку цели и способы применения указателей на функции, о которых мы говорили в $$4.6.9, в равной степени относятся и к таким функциям. Указатель на член можно получить, применив операцию взятия адреса & к полностью уточненному имени члена класса, например, &class_name::member_name. Чтобы описать переменную типа "указатель на член класса X", надо использовать описатель вида X::*. Например:
           #include <iostream.h>

           struct cl
           {
              char* val;
              void print(int x) { cout << val << x << '\n'; }
              cl(char* v) { val = v; }
           };
Указатель на член можно описать и использовать так:
          typedef void (cl::*PMFI)(int);

          int main()
          {
            cl z1("z1 ");
            cl z2("z2 ");
            cl* p = &z2;
            PMFI pf = &cl::print;
            z1.print(1);
            (z1.*pf)(2);
            z2.print(3);
            (p->*pf)(4);
          }
Использование typedef для замены трудно воспринимаемого описателя в С достаточно типичный случай. Операции .* и ->* настраивают указатель на конкретный объект, выдавая в результате функцию, которую можно вызывать. Приоритет операции () выше, чем у операций .* и ->*, поэтому нужны скобки.

Во многих случаях виртуальные функции ($$6.2.5) успешно заменяют указатели на функции.