vtable 存储已实现虚方法的地址。如果一个类的所有方法都是纯虚函数且未实现,则不需要生成 vtable。如果没有从中派生并实现该方法的类,那么您将无法使用这样的类。每个实现虚拟方法的类都有自己的单个 vtable,其中包含所有虚拟方法的地址:它不以任何方式引用基类的 vtable; 地址是重复的。因此,如果您有一个继承自另一个类的类,那么该类将仅使用自己的 vtable。它不关心基类的 vtable; 甚至不需要存在此 vtable。C++ 规范本身并不涉及 vtable; 它们只是一种常见的编译器行为。2020 年的编辑:我大约十年前就写了这篇文章。我怀疑我是根据记忆和个人经验写的。下面的两条评论表明编译器会为基类创建 vtable(以便抛出错误),尽管如果是这样的话,我不知道如何构造对象,并且某些编译器会重用基类的 vtable。自 2011 年以来,似乎没有添加任何内容,而我现在正在认知下降,很难再深入思考,因此,如果这里的某个细节很重要,请自行进行研究。
C++标准没有指定任何有关vtable位置的规定,甚至没有规定v-table的存在。它只规定了行为,而v-table恰好是最直接的实现方式,因此被广泛使用。从实际角度来看,抽象类存在v-table的唯一原因是在构造和析构期间使用,当对象的动态类型是抽象类时。在仅具有纯虚函数的类中,显然不能有构造函数(因为构造函数不能是虚拟的)。但是,析构函数确实可以是虚拟的。您的类仍然可以具有带有实现的pure virtual destructor,然后需要v-table(或等效的实现细节)。但是,纯虚函数的实现很少见,并且不会在定义接口时执行。