Указатели на виртуальные функции-члены. Как это работает?
Рассмотрим следующий код C ++:
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.
Как это случилось?