考虑以下 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。
它是如何发生的?