c++ - 完全纯虚拟类的 Vtable 放置

标签 c++ interface vtable pure-virtual

根据我对 C++ 规范的(有限)了解,具有虚拟成员的类的 vtable 放在第一个非纯非内联虚拟方法的定义处。编译器如何处理从具有所有纯虚拟方法(例如接口(interface))的类继承的类?这种情况下 vtable 放在哪里?

最佳答案

vtable 存储已实现的虚拟方法的地址。如果一个类的所有方法都是纯虚的并且没有实现,则不需要生成 vtable。

如果没有从它派生的一些类并实现这些方法,您将无法使用这样的类。每个实现了虚方法的类都有自己的单个虚表,其中包含所有虚方法的地址:它不以任何方式引用基类的虚表;地址重复。所以如果你有一个继承自另一个类的类,那个类将只使用它自己的 vtable。它不关心基类的vtable;这个 vtable 甚至不需要存在。

C++ 规范本身对 vtable 只字未提;它们只是一种已经变得普遍的编译器行为。

从 2020 年开始编辑:我大约十年前写了这篇文章。我怀疑我是根据内存和个人经验写的。下面的两条评论表明编译器确实为基类创建虚表(以抛出错误),尽管如果是这样我不知道你会如何为它们构造一个对象,并且一些编译器确实重用了虚表基类。自 2011 年以来似乎没有人添加任何东西,我现在的认知能力下降了,真的很难再想太多了,所以如果这里的某些细节很重要,请自己做一些研究。

关于c++ - 完全纯虚拟类的 Vtable 放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4618117/

相关文章:

c++ - unique_ptr 的段错误

c++ - 指向 const 对象作为数据成员的指针

java - 如何使用采用某些枚举类型实例的方法创建接口(interface)?

C++ 虚函数 : Can the linker remove entries in the virtual function table which aren't called?

python - 构建 Python 时出现 QuantLib 1.9 fatal error

c++ - 为什么 `std::string str(nullptr)` 和 `std::string str=nullptr` 是错误的?有人可以详细解释原因吗?

pointers - 如何将接口(interface)转换为结构

Java 重写抽象接口(interface)方法

c++ - 虚拟表和 _vptr 存储方案

c++ - 虚拟调度实现细节