На C++:
#include
struct C {
C() : foo(&C::_g) {}
const char* _f() const { return "C._f() called"; }
const char* _g() const { return "C._g() called"; }
const char* (C::* foo)(void) const;
const char* bar() const { return (this->*(this->foo))(); }
};
int main()
{
C x;
const char* (C::* pmf)(void) const = NULL;
pmf = &C::_f;
std::printf("%s\n", (x.*pmf)()); // => "C._f() called"
std::printf("%s\n", (x.*(x.foo))()); // => "C._g() called"
std::printf("%s\n", x.bar()); // => "C._g() called"
return 0;
}
То же самое на Python:
class C(object):
def _f(self):
return 'C._f() called'
def _g(self):
return 'C._g() called'
foo = _g
if __name__ == '__main__':
x = C()
print x._f() # => 'C._f() called'
print x.foo() # => 'C._g() called'
Запостил ужас "хозяйке на заметку", ибо запомнить чехарду с указателями наx члены не представляется возможным.
(Волшебная ссылка с объяснениями:
[PDF]. Второй раз выручает, бусинка.)