Способ вызова указателя функции также заключается в предоставлении указателя экземпляра его объекта. Это позаботится обо всех проблемах виртуальности:
struct A { void func(); };
int main()
{
typedef void (A::*mf)();
A x; // irrelevant if A is derived or if func is virtual
mf f = &A::func; // pointer-to-member-function
A* p = &x; // pointer-to-instance
(p->*f)(); // invoke via pointer
(x.*f)(); // invoke directly
}
ОК, интересно Синтаксическая проблема Вопрос: Предположим, у меня есть это.
struct Basil { virtual void foo(); virtual ~Basil(); };
struct Derrek : public Basil { virtual void foo(); };
Теперь, если у меня есть Derrek * p
или Basil * p
, я могу вызвать члена Basil
через p->Basil::foo()
. Как я мог сделать то же самое, если бы мне дали void(Derrek::*q)() = &Derrek::foo
?
Ответ: Это невозможно сделать. Один только PMF q
не знает, указывает ли он на виртуальную функцию, не говоря уже о какой, и ее нельзя использовать для поиска функции базового класса во время выполнения. [Спасибо Стиву и Люку!]