関数ポインタを呼び出す方法は、そのオブジェクトのインスタンス ポインタも提供することです。これにより、すべての仮想性の問題が処理されます。
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
}
OK、興味深い構文チャレンジの質問: これがあるとします。
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
回答:できません。PMFq
だけでは、それが仮想関数を指しているかどうか、ましてやどの仮想関数を指しているかがわからず、実行時に基本クラス関数を検索するために使用することはできません。[スティーブとリュックに感謝!]