我提出这个是因为在阅读了许多帖子和答案后,我仍然没有得到答案。如果是这样,请将此标记为重复。
我理解在C++中,虚函数是通过虚指针和虚表来实现的。
但是我不确定 C++ 编译器如何破译在运行时使用哪个虚拟指针?
在以下简单情况下:
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();
}
我知道这p_derived->foo()将寻找(命名) thenDerived::vptr本身,并遵循与. 但是,即使它是静态类型,它又是如何找到的呢?是什么阻止了寻找呢?Derived::vtableDerived::foo()p_base->foo()Derived::vptr -> Derived::vtable -> Derived::foo()p_base->foo()Derived::vptr
Base*p_baseBase::vptr
非常感谢