Pointers to virtual member functions. How does it work?

c++, pointer-to-member, virtual

Solution

Here is way too much information about member function pointers. There's some stuff about virtual functions under "The Well-Behaved Compilers", although IIRC when I read the article I was skimming that part, since the article is actually about implementing delegates in C++.

http://www.codeproject.com/KB/cpp/FastDelegate.aspx

The short answer is that it depends on the compiler, but one possibility is that the member function pointer is implemented as a struct containing a pointer to a "thunk" function which makes the virtual call.

Problem

Consider the following C++ code: ``` class A { public: virtual void f()=0; }; int main() { void (A::*f)()=&A::f; } ``` If I'd have to guess, I'd say that &A::f in this context would mean "the address of A's implementation of f()", since there is no explicit seperation between pointers to regular member functions and virtual member functions. And since A doesn't implement f(), that would be a compile error. However, it isn't. And not only that. The following code: ``` void (A::*f)()=&A::f; A *a=new B; // B is a subclass of A, which implements f() (a->*f)(); ``` will actually call B::f. How does it happen?

Original source