次の 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 を呼び出します。
それはどのように起こりますか?