virtual function call from base class
Well... I'm not sure this should compile. The following,
Base *pBase = new Derived;
is invalid unless you have:
Class Derived : public Base
Is it want you meant? If this is want you meant,
pBase->f();
Then the call stack would go like this:
Derived::f()
Base::f()
Derived::g()
pBase is a pointer to a base. pBase = new Derived returns a pointer to a Derived - Derived is-a Base.
So pBase = new Derived is valid.
pBase references a Base, so it will look at Derived as if it were a Base.
pBase->f() will call Derive::f();
Then we see in the code that:
Derive::f() --> Base::f() --> g() - but which g??
Well, it calls Derive::g() because that is the g that pBase "points" to.
Answer: Derive::g()
It is the Derived::g, unless you call g in Base's constructor. Because Base constructor is called before Derived object is constructed, Derived::g can not logically be called cause it might manipulate variables that has not been constructed yet, so Base::g will be called.
The g of the derived class will be called. If you want to call the function in the base, call
Base::g();
instead. If you want to call the derived, but still want to have the base version be called, arrange that the derived version of g calls the base version in its first statement:
virtual void g() {
Base::g();
// some work related to derived
}
The fact that a function from the base can call a virtual method and control is transferred into the derived class is used in the template method design pattern. For C++, it's better known as Non-Virtual-Interface. It's widely used also in the C++ standard library (C++ stream buffers for example have functions pub...
that call virtual functions that do the real work. For example pubseekoff
calls the protected seekoff
). I wrote an example of that in this answer: How do you validate an object’s internal state?