My question is with reference to this question which explains how virtual functions work in case of object slicing which end up calling base class virtual function and Wikipedia article which explains the virtual table layout for a derived class for below code
class A{
public:
virtual void func(){ cout<<"\n In A:func";}
};
class B:public A{
public:
virtual void func(){ cout<<"\n In B:func";}
};
main(){
A *ptr1 = new B();
A oA = *ptr1;
oA.func();
}
DerviedClassObjectB:
+0: pointer to virtual method table of B
virtual method table of B:
+0: B::func
Above program outputs "In A::func" .
But how does without virtual table for class B knowing about base class A::func ends up calling A::func
This copies any member variables into a new A object. The vtable pointer is not a normal member variable and is not copied. Thus any subsequent virtual functions called against this object will act as if it is an A object, because it is an A object.
"Virtual table for class
B
"? Virtual table for classB
is not involved inoA.func()
call at all. ObjectoA
has typeA
, which means that its virtual table is that of classA
.Moreover, most compilers will optimize the
oA.func()
call so that it won't use any virtual tables at all. Since the type ofoA
is known at compile time, theoA.func()
call can be immediately directed toA::func
without using any virtual tables.