virtual void dev_class::v_func1()
{
base_class::v_func1();
cout << "This is dev_class's v_func1()" << endl;
}
In dev_class‘s v-table, base_class::v_func1() has already overrided by dev_class::v_func1(). Then, why dev_class::v_func1() can call base_class::v_func1()? Where is the base_class::v_func1() function address storing?
When you use qualified function name in a call, the specified function is called directly, without using any “v-tables”. That applies to calls of base class member function from derived class member function (as in your example). That applies to member function calls in all other contexts as well.
For example
Qualified function names suppress and override virtual dispatch mechanism and effectively turn virtual member function call into an ordinary member function call.