Указатели на виртуальные функции-члены. Как это работает?

Рассмотрим следующий код 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.

Как это случилось?

Ответы на вопрос(3)

Ваш ответ на вопрос