I am positing this because after reading many posts and answers I still didn't get my answer. Please kindly flag this as duplicate if it is so.
I understand that in C++, the virtual function is implemented through virtual pointer and virtual table.
However I am not sure how does C++ compiler decipher which virtual pointer to use in runtime?
In below simple case:
class Base {
public:
virtual foo() {}
}
class Derived: public Base {
public:
foo() override {}
}
int main() {
D* p_derived = new Derived();
B* p_base = p_derived;
p_derived->foo();
p_base->foo();
}
I understand that p_derived->foo() will look for Derived::vptr per se for the Derived::vtable (namingly) then Derived::foo(), and p_base->foo() follows the same path as Derived::vptr -> Derived::vtable -> Derived::foo(). But how does p_base->foo() finds Derived::vptr
even though it's static type is Base*? What prevents p_base from finding Base::vptr instead?
Many Thanks