首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >完全纯虚拟类的Vtable放置

完全纯虚拟类的Vtable放置
EN

Stack Overflow用户
提问于 2011-01-07 02:05:16
回答 3查看 1.9K关注 0票数 5

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-07 02:12:19

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

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

C++规范本身并没有提到vtable;它们只是一种已经变得很常见的编译器行为。

2020年编辑:这是我大约十年前写的。我怀疑我是根据记忆和个人经验写的。下面的两个注释表明编译器确实为基类创建了vtable(抛出错误),但如果是这样的话,我不知道如何为它们构造对象,而且一些编译器确实重用了基类的vtable。自2011年以来,似乎没有人添加任何东西,我现在的认知能力有所下降,很难再真正思考太多,所以如果这里的一些细节至关重要,请自己做一些研究。

票数 6
EN

Stack Overflow用户

发布于 2011-01-07 02:31:19

C++标准没有指定关于vtable位置的任何内容,甚至没有指定v-table的存在。它只是指定行为,而v-table恰好是最直接的实现,因此得到了广泛的应用。

实际上,当对象的动态类型是抽象类时,存在抽象类的v表的一个原因是在构造和销毁期间使用。

在只有纯虚函数的类中,显然不能有构造函数(因为构造函数不能是虚的)。然而,析构函数当然可以是虚拟的。

您的类仍然可以有一个带有实现的pure virtual destructor,然后需要v表(或等效的实现细节)。

但纯虚函数的实现很少,而且在定义接口时也不会这样做。

票数 3
EN

Stack Overflow用户

发布于 2011-01-07 02:06:26

在拥有实例之前,您不需要vtable。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4618117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档