Рассмотрим следующий код С++:
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
Если бы мне пришлось догадаться, я бы сказал, что & A:: f в этом контексте будет означать "адрес реализации A f()", так как нет явного разделения между указателями на обычный член функций и виртуальных функций-членов. А поскольку A не реализует f(), это будет ошибкой компиляции. Однако это не так.
И не только это. Следующий код:
void (A::*f)()=&A::f;
A *a=new B; // B is a subclass of A, which implements f()
(a->*f)();
на самом деле вызовет B:: f.
Как это происходит?