是否每个类在C++; 在C++中,每个类都有虚函数表吗?

是否每个类在C++; 在C++中,每个类都有虚函数表吗?,c++,vtable,C++,Vtable,我知道虚拟表是用于多态性的。具有虚拟函数的类必须具有v形表。但是类没有虚函数呢?或者说类没有基类怎么样?作为一种非标准的经验法则(vtables不受标准的支配),它几乎适用于所有编译器: 只有具有虚拟成员函数和/或虚拟析构函数的类才具有vtable。其他班级则不然。这符合C++中“为你所用的付出”的一般规则。 当然,这让您承担了一个重要的责任:您的类是否要以多态方式删除?也就是说,它会被用作公共基类并通过它被删除吗?然后,析构函数虚化。 < P> C++语言规范没有定义“VTABLE”是什么,或

我知道虚拟表是用于多态性的。具有虚拟函数的类必须具有v形表。但是类没有虚函数呢?或者说类没有基类怎么样?

作为一种非标准的经验法则(vtables不受标准的支配),它几乎适用于所有编译器:

只有具有虚拟成员函数和/或虚拟析构函数的类才具有vtable。其他班级则不然。这符合C++中“为你所用的付出”的一般规则。
当然,这让您承担了一个重要的责任:您的类是否要以多态方式删除?也就是说,它会被用作公共基类并通过它被删除吗?然后,析构函数虚化。

< P> C++语言规范没有定义“VTABLE”是什么,或者哪些类需要一个。
<> P>编译器中的C++的具体实现通常使用VTABLE来实现虚拟方法。如果一个类没有虚方法(也没有包含虚方法的超类),那么编译器可能会忽略vtable。但是,请记住,这纯粹是一个编译器实现决策,而不是标准所要求的。

C++语言本身并没有讨论如何实现虚拟函数,即它可以使用vtables或任何其他机制。话虽如此,通常它是使用v-table实现的,并且只有当类包含虚拟函数时才会创建此v-table。

v-table在其中保存函数的地址。此表将保存基类中定义的所有虚拟函数的函数地址。 根据实际对象类型,此地址会发生更改,并调用确切的函数


如果该类不继承任何具有虚函数的类,则它不需要保存任何v表。所有函数调用都将在编译时链接。

Related:所以简短的回答是否。标准没有规定这一点。@LokiAstari:否,但标准确实规定了哪些类是多态的,在合理的实现中,这些类将是唯一具有vtable或等效项的类。@MikeSeymour:是的,我是学究。但是我想说的是,标准没有规定多态性如何影响类的布局(如果有)。可能重复的澄清,它如何实现虚拟实现是定义的,但是,标准布局类型的规则非常严格,编译器没有多少自由。也就是说,标准布局类型不能包含vtable,这将违反标准布局的规则。@edA-qamort-ora-y:我不确定这是否正确。显然,您不能将
vptr
作为第一个成员(第一个声明的成员必须在偏移量0处),但这是我看到的唯一问题。我不相信您可以有任何特殊数据。考虑允许布局兼容类型之间的<代码> MycPy < /代码>,也可以通过中间字符缓冲区。如果这个附加值以某种方式标识了类,那么通过memcpy复制它基本上会损坏目标类型,因为它的特殊值与类的预期值不匹配。如果绝对没有使用这个值,那也没关系,但这与未命名填充完全相同。那么你是说有更好的方法吗?