vptr 和 vtable 如何在下面的虚拟相关代码中工作?

How vptr and vtable works in the bellow virtual related code?

据我所知,当我们在 base class 中创建一个虚拟函数时,编译器会创建一个可以称为 vptr 的指针和一个包含最新版本的虚函数条目的 vtable这个 class 在覆盖函数的情况下。并且 vptr 指向 vtable。 class从基础 class 派生的 es 具有相同的故事,它们有一个指针 vptr 和自己的 vtable,其中包含最新虚函数的条目。要理解我的问题,请遵循代码

#include <iostream>
using namespace std;
class base
{
public:
virtual void display(void)
{
    cout << "base\n";
}
};

class derived : public base
{
public:
void display(void)
{
    cout << "derived\n";
}
};
int main(void)
{
    base *p;
    base ob1;
    derived ob2;
    p=&ob2;
    p->display();//my point starts from here
    p->base::display();

}

在上面的代码中语句p->display(); 对象 p 点调用此 class 的 vptr 并从 vtable 中查找显示函数并绑定它确实有意义。但我不明白我将如何描述语句 p->base::display();在 vptr 和 vtable 方面。编译器将如何绑定基本 class 版本的显示功能。因为在派生 class 的 vtable 中没有基本 class 版本的显示功能. 如果我的知识在这里有任何错误,请告诉我什么是正确的。如果我是对的,请告诉我如何描述 p->base::display();用我描述的逻辑声明 p->display();声明

But i am not understanding that how would i describe the statement p->base::display(); in terms of vptr and vtable .how the compiler will bind the display function of base class version

Vptr 不以任何方式参与该调用。 vptr 仅用于虚拟调度。

在该调用中使用显式范围解析意味着您正在使用静态分派。你是说,不管对象参数的动态类型如何,都调用函数 base::display


虚拟分派是运行时多态的一种形式,也是面向对象编程的一个关键特征。当以虚拟方式调度函数调用时,调用将被调度到继承层次结构中函数的最派生重写,这取决于对象的动态类型。

相比之下,静态调度的函数调用使用编译时名称解析进行调度,不受对象动态类型的影响。这是 C++ 中使用的默认分派类型。它通常也是命令式、面向 non-object 的语言(例如 C.

中唯一的调度类型

虚拟分派只能与虚函数一起使用。虚拟分派通常使用虚函数 table (vtable) 和虚函数指针 (vptr) 来实现。