Pointer to virtual member function - explanation request
Hello,
I have the following code:
#include <iostream>
class Base
{
public:
typedef void (Base::*WhoPtr)() const;
virtual void register_self() = 0;
WhoPtr m_func;
virtual void doIt()
{
(this->*m_func)(); // <<--------- THIS IS
UNCLEAR TO ME!
}
};
class Derived :
public Base
{
public:
virtual void WhoAmI() const
{
std::cout << "I am the Derived" << std::endl;
}
virtual void register_self()
{
m_func = (WhoPtr) &Derived::WhoAmI;
}
};
//
*********************************************************************
int main( int argc, char** argv )
{
Derived theDerived;
theDerived.register_self();
theDerived.doIt();
return 0;
}
The program yields the desired output, i.e. "I am Derived". Now I
designed this piece of code, only to start later having doubts about
it, since I do not precisely understand the magic which happens
there :-(.
Can somebody please explain in a close technical detail what gets
stored in the m_func member and what kind of indirections precisely
the invocation "(this->*m_func)();" leads to w.r.t. vtable?
My doubts come from the fact, that as I understand it, "this" is
pointing to an instance of "Base" in the moment of function invocation
in doIt(). But how does vtable know how to correctly resolve the call
to WhoAmI(), which does not exist in Base? How come, that I am allowed
to correctly invoke a member function on an object which officially
does not implement such a function at all? I am definitely missing
something :-(.
Thanks for explanation.
Peter.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]