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();
}
DerivedClassObjectB:
+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
?
"Virtual table for class B
"? Virtual table for class B
is not involved in oA.func()
call at all. Object oA
has type A
, which means that its virtual table is that of class A
.
Moreover, most compilers will optimize the oA.func()
call so that it won't use any virtual tables at all. Since the type of oA
is known at compile time, the oA.func()
call can be immediately directed to A::func
without using any virtual tables.