【发布时间】:2010-11-08 10:12:48
【问题描述】:
考虑以下 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。
这是怎么发生的?
【问题讨论】:
-
因为编译器让它发生了!如果调用普通方法与调用虚拟方法没有什么不同,为什么您认为使用方法指针时代码有任何不同。您认为编译器将普通方法(虚拟和普通)调用翻译成什么?
标签: c++ virtual member-function-pointers